插座RECV卡在环路中

Socket RECV stuck in loop

本文关键字:环路 RECV 插座      更新时间:2023-10-16

我有以下代码:

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

->这里还有:始终检查返回代码。