2011-10-05 10 views
7

Il blocco NetworkStream.Write si limiterà fino a quando non inserisce i dati da inviare nel buffer di invio TCP o bloccherà fino a quando i dati non saranno effettivamente ACK dall'host ricevente?Quali condizioni causano il blocco di NetworkStream.Write?

Nota: la presa è configurata per il blocco dell'I/O.

Modifica: Whoops, non esiste una cosa come TcpClient.Write ovviamente! Abbiamo capito tutti che stavamo parlando di TcpClient.GetStream().Write, che in realtà è NetworkStream.Write!

risposta

7

A meno .net sta usando qualcosa di diverso da Winsock, poi in base al riferimento Winsock:

Il completamento corretto di una funzione di invio non indica che i dati sono stati consegnati e ricevuti correttamente al destinatario. Questa funzione indica solo che i dati sono stati inviati correttamente.

Se nel sistema di trasporto non è disponibile spazio buffer per contenere i dati da trasmettere, l'invio verrà bloccato a meno che il socket non sia stato messo in modalità non bloccante. Su socket socket non orientati al flusso, il numero di byte scritti può essere compreso tra 1 e la lunghezza richiesta, in base alla disponibilità del buffer su entrambi i computer client e server.

Supponendo che in scrittura sta chiamando inviare sotto, poi un'interpretazione restrittiva della documentazione Winsock indicherebbe che non v'è alcuna gurantee che i dati hanno reso per l'altra estremità del tubo quando ritorna.

Ecco il link per la documentazione Winsock cito a: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

+0

+1 per mostrare un riferimento. Devo ancora trovare altra documentazione su questo argomento, quindi presumo che ciò che stai citando sia probabilmente corretto. –

+1

+1 Buon lavoro sul refernce (è stato sorprendentemente difficile trovare documenti su qualcosa che ho dato per scontato) – tcarvin

+0

(E sì, .NET sta usando i socket OS che sono Winsock su Windows.) –

-1

TcpClient.Write bloccherà fino a quando il buffer del pacchetto non sarà stato scaricato nella rete e gli ACK appropriati sono stati ricevuti. Si noterà che una connessione interrotta di solito finirà per generare un'eccezione sull'operazione Write, poiché attende l'ACK ma non ne ottiene uno entro il periodo di timeout definito.

1

Non sono d'accordo con entrambe le risposte [che indicano che blocca]. La scrittura sul socket TCP/IP non viene bloccata a meno che il buffer sottostante non sia già pieno di dati di non riconoscimento. Generalmente, non blocca ma viene semplicemente trasferito all'implementazione TCP. Ma, naturalmente, ora devo andare a rintracciare alcuni riferimenti a sostegno di questo :)

Da SO

+0

mi sembra di vedere la vostra risposta sia corretta su Mono, mentre le altre risposte sembrano essere corrette su Windows. Sono estremamente confuso. Spero che troverai riferimenti, perché non riesco a trovare nulla di conclusivo. –

Problemi correlati