我正在使用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.
一切正常,直到第5步。服务器端收到我的消息4后发回
msg5应该由$line = <$lsn2>
捕获,而不是捕获有意义的值,它捕获所有0'。我用wireshark看看发生了什么事,在服务器发给我msg5后发送了我身边的RST ACK。
服务器中的函数收到msg4并立即发回msg5。如果我摆脱了该函数中msg4的发送,发送msg5后的内容是FIN ACK
。
有谁能告诉我为什么RST ACK
正在发生? perl脚本可以打开两个套接字并像我一样读写。
答案 0 :(得分:3)
您可能没有完全阅读消息2,在套接字上留下一些数据(换行符,空字符等)。当您尝试阅读消息5时,您将读取此数据,并且在服务器实际发送消息5之前程序将终止。