一个非常简单的win32套接字代码,但工作错误
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 次,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);
或者,您可以使用某种分隔符来分隔消息。
相关文章:
- 一个非常简单的win32套接字代码,但工作错误
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 调试套接字 c++ 代码并帮助我理解
- 发送和十六进制消息时套接字代码C++问题
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- 为什么从我的代码中removig textbox.appendtext()在此处更改套接字通信
- 根据C++代码在 PHP 中创建字节数据并将其传递给套接字
- Windows 套接字编程 - 错误代码 0
- 使用 CAsynSocket,如何捕获套接字操作的退出代码?
- 如何将C++套接字编程代码转换为C#
- 当服务器重新启动并且客户端收到WSAECONNRESET错误代码时,我应该重新创建整个套接字吗
- 创建一个原始套接字 - Debian + 代码块
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 是什么导致了我在套接字代码上的编译错误,以及我如何修复它
- C++套接字编程:sendto()和recvfrom()错误代码10038和in 'server'绑定失败,10038
- 没有多线程的c++套接字不同步/并行代码
- 无法通过windows UDP套接字发送数据:错误代码10035
- 简单UDP套接字代码,发送和接收消息
- 在android代码中创建一个套接字(而不是在android应用程序中)获得Permission Denied