在Perl中通过套接字发送多个有效负载

时间:2012-01-30 22:21:27

标签: perl sockets iis

编辑:问题出在IIS上,而不是我正在使用的Perl代码。其他人在这里谈论同样的问题:https://stackoverflow.com/a/491445/1179075

这里的长期读者,第一次发帖。

所以我正在研究Perl中的一些现有代码,它们执行以下操作:

  
      
  1. 创建套接字
  2.   
  3. 发送一些数据
  4.   
  5. 关闭套接字
  6.   
  7. 循环回1直到发送所有数据
  8.   

为了避免一直创建和关闭套接字的开销,我决定这样做:

  
      
  1. 创建套接字
  2.   
  3. 发送一些数据
  4.   
  5. 循环回2直到发送所有数据
  6.   
  7. 关闭套接字
  8.   

问题是,只发送了第一个有效负载 - 所有后续的有效负载都被忽略。我将此数据发送到.NET Web服务,IIS根本没有接收数据。不知怎的,套接字正在关闭,我没有进一步的线索原因。

这是我用来测试我的新变化的脚本:

use IO::Socket;
my $sock = new IO::Socket::INET(PeerAddr => $hostname, PeerPort => 80, Proto => "tcp", Timeout => "1000") || die "Failure: $! ";
while(1){
    my $sent = $sock->send($basic_http_ping_message);
    print "$sent\n";
    sleep(1);
}
close($sock);

所以这不起作用 - IIS只接收第一个ping。但是,如果我移动$sock的分配并关闭循环,则IIS会正确接收每个ping。

我在这里是否只是错误地使用了套接字,或者我在IIS中是否需要更改一些神秘的设置?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你的问题是缓冲。关闭套接字上的缓冲,或在每次写入后将其冲洗(关闭套接字会产生冲洗的副作用)。

答案 1 :(得分:0)

你得到什么输出?您在send()之后打印,如果send()失败,则会返回undef。您可以打印出错误,如:

     my $sent = $sock->send($msg);
     die "Failed send: $!\n" unless defined $sent;
     print "Sent $sent bytes\n";

我自己的猜测是,您正在连接的服务正在关闭连接,这就是为什么只有一个通过,以及为什么每次都可以创建新连接的原因。