2009-12-09 9 views
5

estoy usando IO::Socket::INET para crear toma de la siguiente manera:Perl problemas de programación toma después de escritura continua A la toma de

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

entonces, quiero leer y escribir datos en ambas tomas de corriente, por lo que la secuencia es:

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. 

todo está bien hasta el paso 5. Después de que el servidor recibe mis Message4 y enviar de vuelta msg5 que se supone que es capturado por $line = <$lsn2>, en lugar de un valor significativo de captura que captura todos 0s. Usé wireshark para ver qué sucedía, recibí un RST ACK de mi lado después de que el servidor me enviara msg5.

Una función en el servidor recibió msg4 y devolvió msg5 inmediatamente. Si elimino el envío de msg4 en esa función, lo que sigue al envío de msg5 es FIN ACK.

¿Alguien me puede decir por qué RST ACK está sucediendo? ¿Puede una secuencia de comandos de Perl abrir dos tomas y leer y escribir como lo hice!

+0

¿Qué quiere decir exactamente cuando dice "todos los ceros"? ¿Obtienes una cadena vacía, undef o en realidad un montón de ceros? – innaM

+0

Compruebe '$!' (Y '$^E') – mob

+0

" todos los ceros "significa que la cadena que utilicé para almacenar el mensaje entrante está vacía. Veo todos los ceros porque empaqué la cadena en una matriz de caracteres. – user195678

Respuesta

3

Es posible que no esté leyendo completamente el Mensaje 2 dejando algunos datos en el zócalo (avance de línea, carácter nulo, etc.). Cuando intenta leer el mensaje 5, en su lugar, lee estos datos y su programa finaliza antes de que el servidor realmente envíe el mensaje 5.

+0

Es posible. Después de crear los dos sockets, agregué $ lsn1-> autoflush (1) y $ lsn2-> autoflush (2) a él. Estoy probando para ver si está bien ahora. – user195678