2009-12-09 2 views
5

소켓에 연속 쓰기 한 후 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

"모두 0"이라고 할 때 정확히 무엇을 의미합니까? 빈 문자열, undef 또는 실제로 제로가 있습니까? – innaM

+0

'$!'(와'$^E')를 확인하십시오. – mob

+0

"모두 0"은 들어오는 메시지를 저장하는 데 사용 된 문자열이 비어 있음을 의미합니다. 문자열을 문자 배열로 채우기 때문에 모두 0으로 표시됩니다. – user195678

답변

3

메시지 2를 소켓에서 완전히 읽지 않고 (줄 바꿈, Null 문자 등) 가능한 경우 일 수 있습니다. 그런 다음 메시지 5를 읽으려고하면 대신이 데이터를 읽고 서버가 실제로 메시지 5를 보내기 전에 프로그램이 종료됩니다.

+0

가능합니다. 두 개의 소켓을 만든 후에 $ lsn1-> autoflush (1)과 $ lsn2-> autoflush (2)를 추가했다. 을 테스트하여 지금 확인했는지 확인합니다. – user195678