一个非常简单的win32 socket代码,但是运行出错

A very simple win32 socket codes,but work wrong

我的客户发送这样的消息:

vector<string> v({
    "aa",
    "bb",
    "cc",
    "dd"
});
for (;; Sleep(3000)) {
    for (int i = 0; i < 4; ++i) {
        send(clientSock, v[i].c_str(), v[i].size(), 0);
    }
}

我的服务器像这样接收消息:

        for (;;) {
            char recvbuf[256] = { 0 };
            int ret = recv(sub_sock, recvbuf, 256, 0);
            if (ret > 0) cout << recvbuf << endl;
        }

我的例外行为是服务器将接收 4 次,并输出 4 次 times.like:

"aa"

"bb"

"cc"

"dd"

但实际上服务器只recv 2次,cout 2次:

"aa"

"bbccdd"

TCP 套接字只是数据流,数据未打包到消息中。您可以写很多次并用一个 recv 阅读所有内容。为了将数据打包到消息中,您需要包含有关每条消息包含多少数据的信息。您可以通过在消息开头提供消息负载的大小来实现:

发送中

std::uint32_t size = htonl(v[i].size());  // convert to network byte order
send(clientSock, &size, sizeof(size), 0);
send(clientSock, v[i].c_str(), v[i].size(), 0);

正在接收

std::uint32_t size;
std::string recvbuf;
recv(sub_sock, &size, sizeof(size), 0);
size = ntohl(size);                       // convert from network byte order
recvbuf.resize(size);
recv(sub_sock, recvbuf.data(), size, 0);

或者您可以使用某种定界符来分隔消息。