gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:54:13 25 4
gpt4 key购买 nike

我正在使用通过 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/

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