这里的长期读者,第一次发帖。
所以我正在研究Perl中的一些现有代码,它们执行以下操作:
- 创建套接字
- 发送一些数据
- 关闭套接字
- 循环回1直到发送所有数据
醇>
为了避免一直创建和关闭套接字的开销,我决定这样做:
- 创建套接字
- 发送一些数据
- 循环回2直到发送所有数据
- 关闭套接字
醇>
问题是,只发送了第一个有效负载 - 所有后续的有效负载都被忽略。我将此数据发送到.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中是否需要更改一些神秘的设置?
谢谢!
答案 0 :(得分:0)
我认为你的问题是缓冲。关闭套接字上的缓冲,或在每次写入后将其冲洗(关闭套接字会产生冲洗的副作用)。
答案 1 :(得分:0)
你得到什么输出?您在send()
之后打印,如果send()
失败,则会返回undef
。您可以打印出错误,如:
my $sent = $sock->send($msg);
die "Failed send: $!\n" unless defined $sent;
print "Sent $sent bytes\n";
我自己的猜测是,您正在连接的服务正在关闭连接,这就是为什么只有一个通过,以及为什么每次都可以创建新连接的原因。