소켓에 연속 쓰기 한 후 Perl 소켓 프로그래밍 문제
$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";
$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 단계까지는 문제가 없습니다. 서버 쪽에서 내 message4를 받고 $line = <$lsn2>
에 의해 캡처되어야하는 msg5을 다시 보낸 후 의미있는 값을 캡처하는 대신 모든 0을 캡처합니다. 무슨 일이 일어 났는지 wireshark를 사용하여, 서버가 msg5를 보낸 후 내 측면의 RST ACK가 전송되었습니다.
서버의 함수가 msg4를 받고 msg5를 즉시 보냅니다. 그 함수에서 msg4를 보내는 것을 없애면, msg5의 전송 다음에 나오는 것은 FIN ACK
입니다.
아무도 RST ACK
가 왜 일어나는지 말해 줄 수 있습니까? perl 스크립트가 두 개의 소켓을 열고 내가했던 것처럼 읽고 쓸 수 있습니까?
"모두 0"이라고 할 때 정확히 무엇을 의미합니까? 빈 문자열, undef 또는 실제로 제로가 있습니까? – innaM
'$!'(와'$^E')를 확인하십시오. – mob
"모두 0"은 들어오는 메시지를 저장하는 데 사용 된 문자열이 비어 있음을 의미합니다. 문자열을 문자 배열로 채우기 때문에 모두 0으로 표시됩니다. – user195678