一个非常简单的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);
或者您可以使用某种定界符来分隔消息。
我的客户发送这样的消息:
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);
或者您可以使用某种定界符来分隔消息。