代码之家  ›  专栏  ›  技术社区  ›  Morinar

IO::获取响应时套接字超时

  •  1
  • Morinar  · 技术社区  · 16 年前

    我正在尝试使用IO::Socket::INET连接到web服务(是的,我知道有很多更好的模块可以实现这一点,但我没有它们,也无法添加它们,所以请不要建议),但我正在超时(我想这就是它正在做的)等待响应。

    $httpSock->print($content);
    
    my @lines = $httpSock->getlines();
    foreach my $line ( @lines ) {
        print $line;
    }
    

    看起来我的请求是立即发出的,然后它等待大约2分钟,然后返回响应。如果我修改代码以使用原始套接字 recv 而不是 getlines() ,阿拉巴马州:

    $httpSock->recv($data, 1024);
    

    我立即得到响应(尽管只有前1024个字符)。我做错什么了吗?我正在使用一个足够晚的IO::Socket版本 autoflush 默认情况下是启用的,但是显式地打开它似乎没有任何区别。我可能也可以继续从套接字读取,直到得到完整的响应,但这肯定比使用 getlines() <$httpSock>

    提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  3
  •   user180804 user180804    16 年前

    我在重新创建您发布的代码片段时遇到问题。以下是我测试的代码:

    use strict;
    use warnings;
    use IO::Socket;
    
    my $httpSock = new IO::Socket::INET(
        PeerAddr => 'www.google.com',
        PeerPort => '80',
        Proto    => 'tcp',
    );
    
    my $content = "HEAD / HTTP/1.0\r\nHost: www.google.com\r\n\r\n";
    
    $httpSock->print($content);
    my @lines = $httpSock->getlines();
    foreach my $line (@lines) {
        print $line;
    }
    

    $ time ./1.pl
    HTTP/1.0 200 OK
    -snip-  
    
    real    0m0.084s
    user    0m0.025s
    sys 0m0.007s
    
        2
  •  3
  •   FModa3    16 年前

    $httpSock->recv($buf, 1024);
    $message = "";
    while (length($buf) > 0) {
        $message .= $buf;
        $httpSock->recv($buf, 1024, MSG_DONTWAIT);
    }
    print $message;
    

    我想知道google的例子是否有效,因为google.com在响应后正在关闭连接。