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

标签 c++ c sockets

我遇到了调用 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/

相关文章:

c++ - 可变参数模板可以匹配非可变参数模板吗?

c++ - 使用 SHA-512 为哈希在 CMS 中创建分离签名

c++ - QMetaType 是否与模板化类型一起使用

c - 关于将指针集成到程序中的建议

windows - 无法在 Eclipse 中运行 junit 测试

php - socket_listen()忽略 'backlog'参数,那么如何设置连接限制?

c - read() 函数中的随机空字符

c++ - 没有逻辑运算符的舍入整数除法

无法运行新的主文件 Xcode

对 Linkfloat 的使用感到困惑