我的客户像这样发送消息:
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”
套接字只是数据流,并且数据没有打包成消息。您可以写许多遍,并全部用一个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);
或者您可以使用某种分隔符来分隔消息。