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

时间:2015-08-03 19:08:37

标签: c++ xml tcp signals recv

我正在使用使用XML over TCP通信的代码。对于每个send()recv()使用setsockopt()等待整个数据,此实现的超时时间为10秒。经过一段时间的工作后,我发现有时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;
}

1 个答案:

答案 0 :(得分:0)

在Linux(以及一般的UNIX)上,可以通过传递信号来中断对var res = exEnum.getValuesFromId(arr[i].points); arr[i].socket.write(JSON.stringify(res)); 的调用。

  

[EINTR]   在任何数据可用之前,recv()函数被捕获的信号中断   <子> man 7 signal

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

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