2011-10-05 19 views
7

¿Se bloqueará NetworkStream.Write solo hasta que coloque los datos que se enviarán en el búfer de envío TCP, o se bloqueará hasta que el host receptor reciba realmente los datos?¿Qué condiciones ocasionan que NetworkStream.Write bloquee?

Nota: El socket está configurado para bloquear E/S.

Edit: ¡Vaya, no existe tal cosa como TcpClient.Write por supuesto! Todos entendimos que estábamos hablando de TcpClient.GetStream().Write, que en realidad es NetworkStream.Write!

Respuesta

7

A menos que .NET está usando algo distinto de Winsock, a continuación, según la referencia del Winsock:

La finalización con éxito de una función de envío no indica que los datos se entregaron y recibieron correctamente al destinatario. Esta función solo indica que los datos se enviaron correctamente.

Si no hay espacio de búfer disponible dentro del sistema de transporte para mantener los datos a transmitir, el envío se bloqueará a menos que el zócalo se haya colocado en modo no bloqueante. En los sockets orientados a secuencias sin bloqueo, el número de bytes escritos puede estar entre 1 y la longitud solicitada, dependiendo de la disponibilidad del búfer tanto en el equipo cliente como en el servidor.

Suponiendo que la escritura está llamando a enviar por debajo, a continuación, una interpretación estricta de la documentación del Winsock indicaría que no hay gurantee que los datos llegaron al otro extremo de la tubería cuando se devuelve.

Aquí está el enlace a los documentos winsock cito de: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

+0

+1 para mostrar una referencia. Aún no he encontrado ninguna otra documentación sobre este tema, así que supongo que lo que está citando probablemente sea correcto. –

+1

+1 Buen trabajo en la referencia (fue sorprendentemente difícil encontrar docos en algo que simplemente daba por hecho) – tcarvin

+0

(Y sí, .NET está utilizando los sockets de SO que son Winsock en Windows.) –

-1

TcpClient.Write se bloqueará hasta que se haya enviado a la red el búfer de paquetes y se hayan recibido los ACK correspondientes. Notarás que una conexión perdida generalmente arrojará una excepción en la operación Write, ya que espera el ACK pero no recibe uno dentro del período de tiempo de espera definido.

1

No estoy de acuerdo con las dos respuestas [que indica que bloquea]. Escribir en el zócalo TCP/IP no se bloquea a menos que el búfer subyacente ya esté lleno de datos de no confirmación. En general, no se bloquea, sino que simplemente se transfiere a la implementación de TCP. Pero por supuesto, ahora tengo que ir a rastrear algunas referencias que apoyen esta :)

De SO

+0

me parece estar viendo a su respuesta sea correcta en Mono, mientras que las otras respuestas parecen ser correctos en Windows. Estoy extremadamente confundido. Espero que encuentres referencias, porque no puedo encontrar nada concluyente. –

Cuestiones relacionadas