TCP连接超时(UNIX / Windows可移植)

dla*_*tte 5 timeout tcp connect

我正在使用perl(希望它不会影响任何东西),但是我需要知道如何为连接操作设置超时。问题是我不能永远等待连接操作的发生。如果几秒钟之内没有发生,我宁愿放弃并继续前进。

socket(my $sock, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]);
setsockopt($sock, SOL_SOCKET, SO_SNDTIMEO, 10); # send timeout

print "connecting...\n";
connect($sock, sockaddr_in(80,scalar gethostbyname('lossy.host.com')));
print "connected...\n";
Run Code Online (Sandbox Code Playgroud)

问题是,如果到“ lossy.host.com”的连接是“有损”或缓慢或除快速以外的其他任何东西,我宁愿放弃,也不愿让用户等待。(可以认为它是做其他事情的程序的副作用……用户可能不希望此脚本与某处的服务器进行通信……)。

线程案例:您将如何中断connect()?您是否只需断开线程并忘记它?

Gra*_*row 1

您可以生成一个单独的线程来执行此操作,然后执行定时等待结果。如果您没有在适当的时间内收到结果,请放弃等待并让线程继续运行。它最终会超时,或者您可能能够终止该线程。

为了回答最初的问题,我认为没有办法改变超时connect(),至少不能通过套接字API。在 Windows 上,如果您可以更改会影响它的注册表项,我不会感到惊讶,但我不知道它会是什么。