gpt4 book ai didi

c++ - C/C++ 套接字和非阻塞 recv()

转载 作者:IT老高 更新时间:2023-10-28 23:11:20 27 4
gpt4 key购买 nike

我遇到了调用 recv() 系统调用不会阻塞的问题。我目前有一个客户端-服务器结构设置,我遇到的问题是我向服务器发送一条消息,而服务器已设置为如下所示:

while (1) {
char buf[1024];
recv(fd, buf, sizeof(buf), flags);
processMsg(buf);
}

它正确接收第一条消息,但 recv() 不会阻止并“接收”不想要的垃圾数据。我只想在消息发送时对消息使用react。任何人都可以建议吗?

最佳答案

recv() 在完成完整请求之前不一定会阻塞,但可以返回部分请求。返回代码将通知您实际收到的字节数可能少于您的请求。即使您指定了 MSG_WAITALL 标志,由于信号等原因,它也可以返回更少。

在 posix 系统上,在阻塞模式下,recv 只会阻塞,直到有一些数据可供读取。然后,它将返回可能少于请求的数据,最多为请求的数量。在非阻塞模式下,如果要读取的数据为零字节,recv 将立即返回,并将返回 -1,将 errno 设置为 EAGAIN 或 EWOULDBLOCK。

结果是通常你会在循环中调用 recv 直到你得到你想要的数量,同时还要检查返回码 0(另一端断开连接)或 -1(一些错误)。

我无法谈论 Windows 行为。

关于c++ - C/C++ 套接字和非阻塞 recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326064/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com