Domanda

Stiamo avendo un problema bizzarro con Indy10 dove due stringhe di grandi dimensioni (a poche centinaia di caratteri ciascuno) che inviamo fuori uno dopo l'altro TCP usando stanno comparendo all'altra estremità intrecciate in modo strano. Questo accade molto di rado.

Ogni stringa è un messaggio completo XML terminato con un LF e, in generale, il processo di lettura legge un intero messaggio XML, tornando quando vede la LF.

La chiamata a inviare effettivamente il messaggio è protetto da una sezione critica intorno alla chiamata al metodo di writeln del IOHandler e quindi non è possibile che due thread per inviare allo stesso tempo. (Siamo certi la sezione critica viene implementato / funziona correttamente). Questo problema si verifica molto raramente. I sintomi sono dispari ... quando inviamo stringa A seguita da stringa B quello che abbiamo ricevuto all'altra estremità (in rare occasioni in cui abbiamo guasto) è la sezione di uscita della stringa A da solo ( ie , c'è un LF alla fine di esso) seguita dalla sezione iniziale di stringa a e quindi l'intera stringa B seguito da un singolo LF. Abbiamo verificato che il "scaduta" proprietà non è vero, dopo la lettura parziale - registriamo che la proprietà dopo ogni lettura che restituisce il contenuto. Inoltre, sappiamo che ci sono personaggi LF incorporati nella stringa, come sostituiamo esplicitamente tutti i caratteri non alfanumerici nella stringa con gli spazi prima di aggiungere il LF e inviarlo.

Abbiamo meccanismi registro all'interno delle sezioni critiche agli estremi sia la trasmissione e ricezione e così possiamo vedere questo comportamento al "filo".

Stiamo completamente sconcertati e si chiede (anche se sempre la possibilità più basso) se ci potrebbero essere alcuni problemi Indy di basso livello che potrebbero causare questo problema, es , buffer di essere inviato in ordine errato. ... molto difficile credere che questo potrebbe essere il problema, ma ci stiamo afferrare a cannucce.

Qualcuno ha qualche idea brillante?

È stato utile?

Soluzione

Hai più thread di lettura dalla stessa presa, allo stesso tempo sul lato di ricezione? Anche solo per sapere lo stato Connected () causa una lettura che si verifichi. Che potrebbe causare il più thread per leggere i dati in entrata e memorizzarlo nella IOHandler.InputBuffer in ordine casuale, se non si sta attenti.

Altri suggerimenti

Si potrebbe provare a Wireshark per scoprire come si trasferì i dati. In questo modo si può scoprire se il problema è nel server o nel client. Ricordarsi inoltre di utilizzare il protocollo TCP per essere "garantito" dati validi in giusto ordine.

Si sta utilizzando il protocollo TCP o UDP? Se si utilizza UDP, è possibile (e attesa) che i pacchetti UDP possono essere ricevuti in un ordine diverso da quello che sono stati trasmessi a causa del percorso attraverso la rete. Se questo è il caso, è necessario aggiungere una sorta di ID pacchetto per ogni pacchetto UDP in modo che il ricevitore può ordinare correttamente i pacchetti.

Hai controllato la impostazioni Nagle del IOHandler? Abbiamo avuto un problema simile che abbiamo fissato impostando UseNagle su false. Nel nostro caso invio e la ricezione di grandi quantità di dati in modalità burst è stato lento a causa di Nagle coalescenza, quindi non è proprio la stessa cosa come la vostra situazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top