插座RECV卡在环路中
Socket RECV stuck in loop
我有以下代码:
while (true)
{
recv(server, buffer, BUFFER_LENGTH, 0);
cout << buffer;
}
我希望发生的情况是,当我的客户端将数据发送到服务器,让它接收数据,输出数据,然后返回尝试接收更多数据,但它从未真正到达cout行。如果我去掉循环,它会很好地工作,为什么while循环使RECV永远不会结束。。?
发送代码:
while (true)
{
cin >> buffer;
send(client, buffer, BUFFER_LENGTH, 0);
}
感谢
std::cout
被缓冲,因此输出不直接可见
尝试
std::cout << buffer << std::flush;
相反。
至于为什么循环永远不会结束:默认情况下,套接字处于阻塞模式,所以只要有一些数据可用,recv
就会等待,然后才返回
您必须将server
套接字移动到非阻塞模式,或者只读取一次。
首先,您必须检查recv()
的返回值。
然后,如果您使用std::cout
,则必须确保您的buffer
是空终止的。
只要没有数据,或者出现错误(或连接关闭、超时等),recv()
就会阻塞。
更新(添加发送代码)
cin >> buffer;
->你的缓冲区可能会溢出。。
send(client, buffer, BUFFER_LENGTH, 0);
->这里还有:始终检查返回代码。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 普通环路未使用gcc 4.8.5自动矢量化
- Linux 服务器中的 Recv 缓冲区大小
- 在 for 循环中处理复杂的发送 recv 消息
- C++ - 标准输入环路
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 为什么套接字中的 recv() 函数不返回任何内容?
- 如何在arduino或Raspberrypi上制作600MHz环路?
- 为什么在环路条件中使用'<='而不是'<'会产生分段错误 [SIGSEGV]?
- C++网络,recv() 无缘无故失败 (?)
- 使用 std::mutex 保护环路
- 设置SO_RCVTIMEO时,为什么recv返回-1并且errno=EINTR
- TCP套接字(客户端-服务器)recv()返回-1值
- 在UNIX中通过recv/send交换数据时,如何正确使用缓冲区
- C++中TCP套接字的recv函数
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 在信号槽机制与传统环路之间做出决定
- 无盖插座的紧密RECV环路
- 插座RECV卡在环路中