perl Socket接收超时设置

一般来说, IO::Socket::INET里的Timeout设置是对于conncet的
如果你想设置recv接收超时, 可以这样设置:

复制代码
 1 usr Socket:
 2 ......
 3 setsockopt($socket, SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 1, 0));
 4 #注意这里pack有三个参数, 后面的1表示超时1秒, 最后的0你可以默认
 5 #而前面的'l!l!', !表示64位平台
 6 #如果你是用IO::Socket::INET他的socket, 可以这样:
 7 use IO::Socket::INET;
 8 my $socket = IO::Socket::INET->new();
 9 $socket->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 1, 0));
10  
11 #如果你觉得麻烦, 可以安装 IO::Socket::Timeout模块, 用如下方式设置接收超时或发送超时:
12 # 1. Creates a socket as usual
13 my $socket = IO::Socket::INET->new( ... );
14  
15 # 2. Enable read and write timeouts on the socket
16 IO::Socket::Timeout->enable_timeouts_on($socket);
17  
18 # 3. Setup the timeouts
19 $socket->read_timeout(0.5);
20 $socket->write_timeout(0.5);
21  
22 # 4. Use the socket as usual
23 my $data = <$socket>;
24  
25 #
复制代码

这里有一点要说明, 可能新人有点迷惑。
那就是io::socket::inet创一个socket时, 这个socket是未定义的, 要等 到它连接成功了才变成定义状态。
所以, 当你用io::socket::timeout时, 记得要连接成功了才调用, 要不会出现error, 提示方法不能用于一个未定义的变量。

像上面的代码所示, 如果把20行放到17行的位置, 程序将会出错。

文章参考自:http://blog.booking.com/socket-timeout-made-easy.html

posted on   Perl6  阅读(1624)  评论(0)    收藏  举报

编辑推荐:
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 我最喜欢的 C# 14 新特性
阅读排行:
· 微软开源的 MCP 教程「GitHub 热点速览」
· 记一次 .NET 某汽车控制焊接软件 卡死分析
· 博客园出海记-开篇:扬帆启航
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次C#平台调用中因非托管union类型导致的内存访问越界

导航

< 2025年8月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
点击右上角即可分享
微信分享提示