2009-12-09 82 views
5

我使用IO::Socket::INET创建插座这样的:连续写后的Perl socket编程问题插座

$lsn1 = IO::Socket::INET->new(
          PeerAddr => '192.168.0.2', 
          PeerPort => 1850, 
          Proto => 'tcp', 
          Type  => SOCK_STREAM 
    ) || die "Can't connect to 192.168.0.2:1850 : $!\n"; 

$lsn2 = IO::Socket::INET->new(
          PeerAddr => '192.168.0.2', 
          PeerPort = >1852, 
          Proto => 'tcp', 
          Type  => SOCK_STREAM 
    ) || die "Can't connect to 192.168.0.2:1852 : $!\n"; 

的话,我想读取和写入数据到两个插槽,这样的顺序是:

1. $lsn1->print(msg1); send message 1 to server from $lsn1. 
2. $line = <$lsn2>;  receive message 2 from server from $lsn2. 
3. $lsn2->print(msg3); send message 3 to server from $lsn2. 
4. $lsn2->print(msg4); send message 4 to server from $lsn2. 
5. $line = <$lsn2>;  receive message 5 from server. But it is all zeros! However I can 
         see the data on wireshark. 

一切都很好,直到第5步。服务器端收到我的消息4并发回 msg5应该由$line = <$lsn2>捕获,而不是捕获有意义的值它捕获所有0'。我使用wireshark来查看发生了什么,服务器发送给我msg5后,发送了来自我身边的RST ACK。

服务器中的一个函数收到msg4并立即发回msg5。如果我在该功能中删除了msg4的发送,那么发送msg5之后是FIN ACK

谁能告诉我为什么RST ACK正在发生? Perl脚本可以打开两个套接字并像我一样读写。

+0

当您说“全零”时,您的意思是什么?你得到一个空字符串,undef,或者实际上是一堆零? – innaM

+0

检查'$!'(和'$^E') – mob

+0

“全零”表示我用来存储传入消息的字符串为空。我看到所有的零,因为我将字符串打包成字符数组。 – user195678

回答

3

您可能并未完全读取消息2,从而在套接字上留下一些数据(换行符,空字符等)。然后,当您尝试阅读消息5时,您将读取此数据,并且在服务器实际发送消息5之前程序终止。

+0

这是可能的。创建两个套接字后,我为其添加了$ lsn1-> autoflush(1)和$ lsn2-> autoflush(2)。我正在测试 以查看它现在是否可用。 – user195678