gpt4 book ai didi

tcp 连接超时(unix/windows 便携)

转载 作者:可可西里 更新时间:2023-11-01 02:32:56 28 4
gpt4 key购买 nike

我正在使用 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";

问题是,如果与“lossy.host.com”的连接“有损”或速度慢或速度不快,我宁愿放弃也不愿让用户等待。 (将其视为执行其他操作的程序的副作用......用户可能不希望此脚本与某处的服务器通信......)。

线程案例:如何中断 connect()?你会不会只是分离线程而忘记它?

最佳答案

您可以使用fcntl 将套接字设置为非阻塞,然后select 超时等待它变得可读。如果它在超时之前无法读取,您可以在此时关闭它。

我知道如何在 C 中执行此操作,但不知道如何在 perl 中执行此操作,否则我会给您举个例子。 perlfunc 联机帮助页说所有这些函数都存在,粗略阅读似乎说它们会按您想要的方式工作。

编辑:抱歉,错过了 perlfunc 说它们可能在非 Unix 系统上不可用的部分,事实上,fcntl 在 win32 上不可用。不过,您可以使用一个 IO::Socket 库,它将在 Windows 上做正确的事情。

这是适合我的示例代码(无论如何在 Linux 上):

#!/usr/bin/perl

use IO::Socket::INET;
use IO::Select;

$sock = IO::Socket::INET->new('PeerAddr' => 'lossy.host.com',
'PeerPort' => 80,
'Blocking' => 0 );

$sel = IO::Select->new( $sock );

@writes = $sel->can_write(10);

if ( $sock->connected ) {
print "socket is connected\n";
} else {
print "socket not connected after however long\n";
$sock->close;
}

关于tcp 连接超时(unix/windows 便携),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2043920/

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