2009-12-09 15 views
5

Sto usando IO::Socket::INET per creare presa in questo modo:Perl problemi di programmazione presa dopo scrittura continua a presa

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

poi, voglio leggere e scrivere dati su entrambe le prese, quindi la sequenza è:

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. 

tutto va bene fino a quando il passaggio 5. Dopo che il lato server riceve i miei Message4 e rispedire msg5, che si suppone sia la cattura da $line = <$lsn2>, invece di cattura valore significativo è catturare tutti 0. Ho usato wireshark per vedere cosa è successo, un ACK RST da parte mia è stato inviato dopo che il server mi ha inviato msg5.

Una funzione nel server ha ricevuto msg4 e restituisce immediatamente msg5. Se si elimina l'invio di msg4 in quella funzione, ciò che segue l'invio di msg5 è FIN ACK.

Qualcuno può dirmi perché sta accadendo lo RST ACK? Uno script perl può aprire due socket e leggere e scrivere come ho fatto io.

+0

Cosa intendi esattamente quando dici "tutti gli zeri"? Hai una stringa vuota, undef o in realtà un mucchio di zeri? – innaM

+0

Controllare '$!' (E '$^E') – mob

+0

" tutti gli zeri "significa che la stringa che ho usato per memorizzare il messaggio in arrivo è vuota. Vedo tutti gli zeri perché impacco la stringa nell'array dei caratteri. – user195678

risposta

3

È possibile che non si stia leggendo completamente il Messaggio 2 lasciando alcuni dati sul socket (line feed, carattere null, ecc.). Quando tenti di leggere il messaggio 5, leggi invece questi dati e il tuo programma termina prima che il server invii effettivamente il messaggio 5.

+0

È possibile. Dopo aver creato i due socket, ho aggiunto $ lsn1-> autoflush (1) e $ lsn2-> autoflush (2) ad esso. Sto testando per vedere se ora è ok. – user195678