gpt4 book ai didi

c++ - 连接超时与 Alarm()

转载 作者:太空狗 更新时间:2023-10-29 21:28:22 26 4
gpt4 key购买 nike

由于我似乎找不到解决我原来问题的方法,所以我尝试做一些变通方法。我只是想为我的 TCP 套接字的 connect() 调用设置超时。

  1. 我希望 connect() 被阻塞,但直到通常的 75 秒超时才阻塞,我想定义我自己的。
  2. 我已经尝试过 select() ,它在超时时有效,但我无法建立连接(这是我最初遇到的问题,如 here 所述)。

所以现在我找到了另一种方法来处理它:只做一个阻塞的 connect() 调用,但用这样的警报中断它:

    signal(SIGALRM, connect_alarm);
int secs = 5;
alarm(secs);
if (connect(m_Socket, (struct sockaddr *)&addr, sizeof(addr)) < 0 )
{
if ( errno == EINTR )
{
debug_printf("Timeout");
m_connectionStatus = STATUS_CLOSED;
return ERR_TIMEOUT;
}
else
{
debug_printf("Other Err");
m_connectionStatus = STATUS_CLOSED;
return ERR_NET_SOCKET;
}
}

static void connect_alarm(int signo)
{
debug_printf("SignalHandler");
return;
}

这是我在网上的一个跟帖here找到的解决方法在计算器上。如果我使用此代码,程序将启动计时器,然后进入 connect() 调用。 5 秒后,信号处理程序被触发(如在控制台上看到的 printf()),但此后程序仍保留在 connect() 函数中75 秒。实际上每个描述都说 connect_alarm() 应该中断 connect() 函数,但在我的情况下似乎没有。有什么办法可以解决我的问题?

最佳答案

signal 是一个大量未指定的接口(interface),应在新代码中避免使用。在某些版本的 Linux 上,我相信它提供了“BSD 语义”,这意味着(除其他外)默认提供 SA_RESTART

使用sigaction相反,不要指定 SA_RESTART,您应该可以开始了。

...

嗯,除了一般的脆弱性和不可避免的竞争条件,就是这样。 connect 将为任何 信号返回EINTR,而不仅仅是SIGALARM。更麻烦的是,如果系统恰好负载很重,调用alarm和调用connect之间可能需要5秒以上的时间,在这种情况下你会错过信号并永远阻塞在 connect 中。

您之前的尝试是将非阻塞套接字与 connectselect 结合使用,这是一个更好的主意。我建议对其进行调试。

关于c++ - 连接超时与 Alarm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092633/

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