C++Socket套接字网络通信TCP协议

本来打算去虚拟机的server服务器上演示,但是没有设置明白虚拟机和本机的内网IP地址问题,所以就在本机上演示了。

客户机

#pragma comment(lib, "ws2_32.lib")

#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>


//定义程序中使用的常量      
#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址      
#define PORT           5150         //服务端程序端口     
#define MSGSIZE        1024         //收发缓冲区的大小         

int main()
{
    WSADATA wsaData;
    //连接所用套节字      
    SOCKET sClient;
    //保存远程服务器的地址信息      
    SOCKADDR_IN server;
    //收发缓冲区      
    char szMessage[MSGSIZE];
    //成功接收字节的个数      
    int ret;

    //加载初始化  
    WSAStartup(0x0202, &wsaData);

    //创建客户端套接字      
    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP协议     
    //SOCK_STREAM, IPPROTO_TCP具体指明使用TCP协议      
    // 指明远程服务器的地址信息(端口号、IP地址等)      
    memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0   
    server.sin_family = PF_INET; //使用INET协议   
    server.sin_port = htons(PORT); //端口,本机字节转换成网络字节   
    server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //服务端的IP地址   
    //结构SOCKADDR_IN的sin_addr字段用于保存IP地址,sin_addr字段也是一个结构体,sin_addr.s_addr用于最终保存IP地址      
    //inet_addr()用于将 形如的"127.0.0.1"字符串转换为IP地址格式      
    //连到刚才指明的服务器上      
    connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN)); //连接后可以用sClient来使用这个连接      
    //server保存了远程服务器的地址信息      
    while (TRUE) {
        printf("Send:");
        //从键盘输入      
        gets_s(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage      
        // 发送数据      
        send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度 
    }

    // 释放连接和进行结束工作      
    closesocket(sClient);
    WSACleanup();
    return 0;
}

服务器

#pragma comment(lib, "ws2_32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h> 

#define PORT           5150    //端口(一共六万多个)
#define MSGSIZE        1024    //接收的数据
 

int main()
{
    //服务端

    //初始化windows套接字网络库
    WSADATA wsaData;
    SOCKET sListen;//服务端套接字
    SOCKET sClient;//客户端套接字
    SOCKADDR_IN local;//服务端地址
    SOCKADDR_IN client;//客户端地址
    char szMessage[MSGSIZE];
    int ret;
    int iaddrSize = sizeof(SOCKADDR_IN);//客户端地址的长度
    WSAStartup(0x0202, &wsaData);//连接

    //创建一个服务端的套接字
    sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//TCP协议

    //绑定,将套接字和服务端地址做绑定
    local.sin_family = AF_INET;//协议,INET协议
    local.sin_port = htons(PORT);//端口,本机字节转变成网络字节
    local.sin_addr.s_addr = htonl(INADDR_ANY);//地址,本机字节转变成网络字节,任何一个客户端IP都可以连接上来
    bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));//做绑定

    //开始监听
    //最多有1个客户端连接,超了就在队列排队等待
    listen(sListen, 1);

    //接收客户端的连接
    sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize);
    printf("Accepted client:%s:%d
", inet_ntoa(client.sin_addr),
        ntohs(client.sin_port));

    while(TRUE) 
    {
        ret = recv(sClient, szMessage, MSGSIZE, 0);
        szMessage[ret] = '';
        printf("Received [%d bytes]: '%s'
", ret, szMessage);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/nxopen2018/p/14022347.html