2013-02-27 12 views
5

Sto riscontrando un problema nel ricevere i dati da un client usando i socket .net. Il client comunica con TCP e invia uno o due pacchetti prima di chiudere immediatamente la connessione. La ricezione va così:Reset connessione socket prima che potessi leggere i dati

Socket newConnection = listener.EndAccept(ar); 
newConnection.BeginReceive(myBuffer,0, length, SocketFlags.None, Callback,null); 

e l'esecuzione non andrà oltre. Il beginReceive lancia immediatamente una SocketException che dice che la connessione è stata ripristinata. Non riesco a ottenere i dati ricevuti.

Ecco quello che vedo per questa connessione su Wireshark:

SYN // SYN, AKC // AKC 
PSH, ACK for 156 bytes 
PSH, ACK for 176 bytes 
RST, ACK 

E questo è tutto. C'è qualche mezzo per ottenere questi dati ricevuti anche se la connessione è chiusa dal client?

+0

C'è qualche modo si può avere il client di attendere un pacchetto "riconosciuta" dal programma di ricezione prima di chiudere? –

+0

Non posso davvero. Il client è utilizzato su altri server e funziona, quindi dovrei essere in grado di fare lo stesso. Non ho accesso al codice sorgente di questi altri server per vedere come lo fanno. –

+0

Non si può fare molto se non si leggono i dati prima che un RST entri (questo indica che il mittente sta chiudendo in modo abortivo). Perché il mittente invia un RST anziché un FIN (ad esempio, chiusura aggraziata, [Socket.Shutdown] (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx))? –

risposta

-1

Prima di tutto con questo tipo di comunicazione potrebbe essere una buona idea passare a UDP anziché a TCP - in questo modo sarete in grado di ottenere i pacchetti indipendentemente dallo stato del mittente.
Supponendo TCP è l'unica opzione - Io suggerirei di usare le chiamate sincrone:

Socket newConnection = listener.AcceptSocket(); 
newConnection.Receive(myBuffer, 0, length, SocketFlags.None); 
+1

Se deve cambiare il client per usare UDP, potrebbe anche cambiarlo non inviare l'RST. –

+0

E l'uso della chiamata sincrona non cambia nulla. Il socket verrà comunque ripristinato al termine della chiamata AcceptSocket e verrà ricevuto ancora –

Problemi correlati