一个非常简单的win32套接字代码,但是工作错误

问题描述 投票:0回答:1

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

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次,而cout 4次。例如:

“ aa”

“ bb”

“ cc”

“ dd”

但是实际上服务器仅接收两次,而cout两次:

“ aa”

“ bbccdd”

c++ winsock
1个回答
0
投票

套接字只是数据流,并且数据没有打包成消息。您可以写许多遍,并全部用一个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);

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

© www.soinside.com 2019 - 2024. All rights reserved.