C++:setsockopt() 可以被信号忽略吗?

标签 c++ xml tcp signals recv

我正在使用通过 TCP 通信使用 XML 的代码。此实现对每个 send()recv() 都有 10 秒超时,以使用 setsockopt() 等待整个数据。经过一段时间的工作后,我发现有时 recv() 不会等待超时并返回 -1 值。当我试图解决这个问题时,我在代码中添加了一个 sleep(2) 并且我发现每次遇到 recv 错误时 sleep() 都会被中断.基于此我认为问题的根源是一个信号,但我没能找到是哪个信号。

我的问题如下:recv() 的等待会被信号中断吗?注意:recv() 的等待设置在 setsockopt()

编辑: 这是解决方案(感谢您的帮助):

while (buf > 0)
{
  rsize = recv(socket, bufsize, buf, 0)
  if (rsize == -1)
  {
    if (errno == EINTR)
      continue;
    break;
  }
  break;
}

最佳答案

在 Linux(和一般的 UNIX)上,对 recv() 的调用可能会被信号传递中断。

[EINTR] The recv() function was interrupted by a signal that was caught, before any data was available.
POSIX

如果您遇到 EINTR 或检测到比预期短的消息大小,只需重新启动您的 recv()(根据目前已读取的字节数进行调整)。

如果您使用sigaction() 来建立您的信号处理程序,您可以设置SA_RESTART 标志以允许系统调用在调用信号处理程序后自动重新启动。 recv() 是将在 Linux 下重新启动的调用之一(详细信息可在 man 7 signal 中找到)。

关于C++:setsockopt() 可以被信号忽略吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794928/

相关文章:

c++ - 使用winsock api同时打开tcp连接

c++ - 无法在 C++ 中读取 .txt 文件

c++ - 找不到 CMAKE 所需的 header sys/stat.h

c++ - 可以在不改变其状态的情况下遍历 stringstream 中的字符吗?

javascript - 使用 Javascript 插入 XML 节点

android - 如何在按下时更改 Material float 操作按钮的颜色?

http - 为什么 SNDBUF 太低会破坏 HTTP?

java - 通过套接字传输文件时文件损坏

xml - 如何从 XML 样本生成 XSLT

tcp - 当以太网接收缓冲区已满时会发生什么