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

A very simple win32 socket codes,but work wrong

本文关键字:代码 套接字 错误 工作 win32 一个 简单 非常      更新时间:2023-10-16

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

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 次。

"啊">

"哗啦啦">

"抄">

"滴">

但实际上服务器只接收了 2 次,并且 cout 两次:

"啊"

"哗啦啦">

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);

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