2012-05-31 16 views
6

Sto scrivendo un livello di messaggio per il mio sistema distribuito. Sto usando IOCP, cioè i metodi Socket.XXXAsync.Il buffer SocketAsyncEventArgs è pieno di zeri

Ecco qualcosa abbastanza vicino a quello che sto facendo (in realtà, la mia funzione di ricezione si basa sulla sua): http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

Quello che ho trovato ora è che all'inizio del programma (due test server che parlano tra loro) Ogni volta ottengo un numero di oggetti SAEA in cui il .Buffer è interamente pieno di zeri, tuttavia il .BytesTransferred è la dimensione del buffer (1024 nel mio caso).

Cosa significa? C'è una condizione speciale che devo controllare? Il mio sistema lo interpreta come un messaggio incompleto e procede, ma mi chiedo se in realtà mi mancano alcuni dati. Avevo l'impressione che se non fosse stato ricevuto nulla, non avresti ricevuto una richiamata. In ogni caso, posso vedere in WireShark che non ci sono pacchetti a lunghezza zero in arrivo.

Ho trovato il seguente quando l'ho cercato su Google, ma non sono sicuro che il mio problema sia lo stesso: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

+0

Non ho riscontrato errori di elaborazione dati da dati persi, quindi penso che non ci sia nulla di perso. Ma ciò lascia ancora la domanda sul perché il metodo sarebbe tornato con niente, molte volte. – Carlos

+1

È difficile fornire la soluzione necessaria senza una breve descrizione (con codice). Tuttavia ho avuto esperienza con Sockets e posso consigliare di utilizzare un'astrazione più alta - Network Stream. Network Stream ha tutte le funzionalità di callback asincrono che si desidera utilizzare. Guardare http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx e http://msdn.microsoft.com/en-us/library/system.net.sockets. networkstream.beginwrite.aspx HTH –

+0

Sono le stesse chiamate sottostanti? Sembra utile. Inoltre, il codice a cui mi riferisco è nel link. – Carlos

risposta

0

sono sicuro che non è quello che sta succedendo nell'esempio collegato. Sembra che utilizzi socket asincroni in modo sincrono. Non riesco a vedere nessun callback o simile nel codice. Potrebbe essere necessario rivedere se sono necessari socket sincroni o asincroni :).

Il problema in questione deriva dalla possibilità che le funzioni stiano cercando di leggere/scrivere sul buffer prima che la trasmissione/ricezione di rete sia stata completata. Prova a utilizzare la funzionalità di callback inclusa nel socket asincrono. Per esempio.

// This goes into your accept function, to begin receiving the data 
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length, 
     SocketFlags.None, new AsyncCallback(OnRecieveData), socketName); 

// In your callback function you know that the socket has finished receiving data 
// This callback will fire when the receive is complete. 
private void OnRecieveData(IAsyncResult input) { 
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast 
    inSocket.EndReceive(input); 

    // Pull the data out of the socket as you already have before. 
    // state.Data.Write ...... 
} 
+0

I callback sono i gestori di eventi negli oggetti SAEA. In realtà ho eseguito il codice con alcuni errori grammaticali minimi. – Carlos

+0

È possibile incollare il codice ricevente in pastebin o simili, ho visto solo l'esempio su cui si basa il proprio. – themartinmcfly

Problemi correlati