连续写入套接字后的Perl套接字编程问题

连续写入套接字后的Perl套接字编程问题,perl,tcp,sockets,Perl,Tcp,Sockets,我正在使用IO::Socket::INET创建如下套接字: $lsn1 = IO::Socket::INET->new( PeerAddr => '192.168.0.2', PeerPort => 1850, Proto => 'tcp',

我正在使用
IO::Socket::INET
创建如下套接字:

$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.
1$lsn1->打印(msg1);从$lsn1向服务器发送消息1。
2. $行=;从$lsn2接收来自服务器的消息2。
3. $lsn2->打印(msg3);从$lsn2向服务器发送消息3。
4. $lsn2->打印(msg4);从$lsn2向服务器发送消息4。
5. $行=;从服务器接收消息5。但都是零!无论如何我能
请参阅wireshark上的数据。
在第五步之前一切都很好。服务器端收到我的消息4并发回后 msg5应该由
$line=
捕获,而不是捕获有意义的值,它捕获所有0”。我使用wireshark查看发生了什么,在服务器向我发送msg5后,从我这边发送了RST ACK

服务器中的一个函数收到msg4并立即发回msg5。如果我在该函数中取消发送msg4,那么在发送msg5之后会出现
FIN ACK


有谁能告诉我为什么会发生
RST ACK
?perl脚本可以像我一样打开两个套接字并读写吗

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

您说“全零”是什么意思?你得到一个空字符串,undef,或者实际上是一堆零吗?“全零”意味着我用来存储传入消息的字符串是空的。我看到所有的零,因为我将字符串打包到字符数组中。不确定$的作用是什么!而$^E在perl中是这样做的。我对perl比较陌生。但我确实印了美元!和$^E,什么也不给我。RST ACK通常表示端口关闭。但是我没有关闭我的端口。RST-ACK更像是“此处不需要您的数据,端口已关闭”。如果您的平台支持的话,我很想用“strace-eclose,networkperl{script}”跟踪这样一个程序的行为。不知何故,您的程序在第2行和第5行之间关闭了$lsn2,这就解释了当预期的数据包到达时,TCP会拒绝它,当您尝试读取套接字时,您什么也得不到。这是可能的。创建两个套接字之后,我向其中添加了$lsn1->autoflush(1)和$lsn2->autoflush(2)。我正在测试它现在是否正常。