什么是socket

socket是一套用于不同主机间的API。
IP地址用于唯一标识网络设备;端口用于区分主机上的不同应用(进程);
通过socket可以在不同主机不同应用之间建立一条虚拟通道;(点对点,应用对应用);
socket有两种类型,TCP(一对一数据流,不会丢包)和UDP(广播式);

服务器Server.cpp

1.创建一个socket, AF_INET表示使用的是IPV4地址,SOCK_STREAM表示使用的是TCP协议

SOCKET serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

2.bind函数表示的是将我们的socket关联到我们的主机的网卡和端口上

bind(serverSock, (sockaddr*)&serverAddr, sizeof(serverAddr));

3.listen函数将我们的socket设置为监听状态,等待客户端的连接

listen(serverSock, 5);

4.接受任意客户端的连接,并返回一个新的socket和IP地址

sockaddr_in clientAddr;
int addrLen = sizeof(clientAddr);
SOCKET clientSock = accept(serverSock, (sockaddr*)&clientAddr, &addrLen);

5.配置客户端功能

char recvBuf[BUF_SIZE];
    while (true)
    {
        // 接收客户端消息
        ZeroMemory(recvBuf, BUF_SIZE);
        int ret = recv(clientSock, recvBuf, BUF_SIZE, 0);
        if (ret <= 0)
        {
            cout << "客户端断开连接" << endl;
            break;
        }
        cout << "客户端:" << recvBuf << endl;

        // 服务器回复消息
        string sendMsg;
        cout << "输入回复:";
        getline(cin, sendMsg);
        send(clientSock, sendMsg.c_str(), sendMsg.length(), 0);
    }

客户端Client.cpp

1.同样创建一个socket

    SOCKET clientSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

2.配置好服务器的IP地址和端口号

sockaddr_in serverAddr{};
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);

3.连接服务器

connect(clientSock, (sockaddr*)&serverAddr, sizeof(serverAddr));
    cout << "已连接聊天服务器!" << endl;

4.配置客户端功能

char recvBuf[BUF_SIZE];
    while (true)
    {
        // 发送消息给服务器
        string sendMsg;
        cout << "输入消息:";
        getline(cin, sendMsg);
        send(clientSock, sendMsg.c_str(), sendMsg.length(), 0);

        // 接收服务器回复
        ZeroMemory(recvBuf, BUF_SIZE);
        recv(clientSock, recvBuf, BUF_SIZE, 0);
        cout << "服务器:" << recvBuf << endl;
    }

实现结果

在这里插入图片描述
在这里插入图片描述

更多推荐