我正在使用使用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;
}
答案 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下重新启动的调用之一(详细信息见)。