zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2.1.4 现代计算机的设计原则(译)
    2.1.2 指令执行(译)
    计算机体系结构之一体系结构【译】
    2.2.1 比特【译】
    2.1.6 处理器级并行【译】
    jQery Datatables回调函数中文
    彪悍的人生不需要解释
    程序员读书雷达
    打开页面自动打开QQ的javascript代码
    EF大数据插入
  • 原文地址:https://www.cnblogs.com/perl6/p/6136200.html
Copyright © 2011-2022 走看看