2009-12-09 6 views
5

I IO::Socket::INET bin mit Sockeln wie diese zu erstellen:Perl Socket-Programmierung Probleme nach dem kontinuierlichen Schreib an Buchse

$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"; 

dann, ich möchte Daten an beiden Buchsen lesen und schreiben, so ist die Reihenfolge:

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. 

alles ist in Ordnung, bis Schritt 5. Nach der Server-Seite erhalten meine Nachricht4 und zurück senden msg5, die Erfassung von $line = <$lsn2> sein soll, statt sinnvollen Wert erfassen erfassen alle 0s '. Ich benutze wireshark, um zu sehen, was passiert ist, ein RST ACK von meiner Seite wurde gesendet, nachdem der Server mir msg5 geschickt hat.

Eine Funktion im Server empfangen msg4 und senden sofort msg5 zurück. Wenn ich das Senden von msg4 in dieser Funktion loslasse, folgt auf das Senden von msg5 FIN ACK.

Kann mir jemand sagen, warum RST ACK passiert? Kann ein Perl-Skript zwei Sockets öffnen und lesen und schreiben, wie ich es getan habe.

+0

Was genau meinen Sie, wenn Sie "alle Nullen" sagen? Erhalten Sie eine leere Zeichenfolge, undef oder tatsächlich eine Reihe von Nullen? – innaM

+0

Überprüfen Sie '$!' (Und '$^E') – mob

+0

" alle Nullen "bedeutet, dass die Zeichenfolge, die ich zum Speichern eingehender Nachricht verwendet habe, leer ist. Ich sehe nur Nullen, weil ich die Zeichenfolge in ein Zeichenfeld packe. – user195678

Antwort

3

Es ist möglich, dass Sie Nachricht 2 nicht vollständig lesen und einige Daten auf dem Socket hinterlassen (Zeilenvorschub, Nullzeichen usw.). Wenn Sie dann versuchen, Nachricht 5 zu lesen, lesen Sie stattdessen diese Daten und Ihr Programm wird beendet, bevor der Server tatsächlich Nachricht 5 sendet.

+0

Es ist möglich. Nachdem ich die beiden Sockets erstellt habe, habe ich $ lsn1-> autoflush (1) und $ lsn2-> autoflush (2) hinzugefügt. Ich teste um zu sehen, ob es jetzt in Ordnung ist. – user195678