A pesar de la documentación, NetworkStream.Write no parece esperar hasta que se hayan enviado los datos. En cambio, espera hasta que los datos se hayan copiado en un búfer y luego regresen. Ese buffer se transmite en segundo plano.NetworkStream.Write devuelve inmediatamente: ¿cómo puedo saber cuándo ha terminado de enviar datos?
Este es el código que tengo en este momento. Si uso ns.Write o ns.BeginWrite no importa, ambos regresan inmediatamente. EndWrite también regresa inmediatamente (lo cual tiene sentido ya que está escribiendo en el búfer de envío, no escribiendo en la red).
bool done;
void SendData(TcpClient tcp, byte[] data)
{
NetworkStream ns = tcp.GetStream();
done = false;
ns.BeginWrite(bytWriteBuffer, 0, data.Length, myWriteCallBack, ns);
while (done == false) Thread.Sleep(10);
}
public void myWriteCallBack(IAsyncResult ar)
{
NetworkStream ns = (NetworkStream)ar.AsyncState;
ns.EndWrite(ar);
done = true;
}
¿Cómo puedo saber cuándo se han enviado realmente los datos al cliente?
Quiero esperar 10 segundos (por ejemplo) para recibir una respuesta del servidor después de enviar mis datos. De lo contrario, supongo que algo estuvo mal. Si tarda 15 segundos en enviar mis datos, siempre se agotarán los tiempos de espera, ya que solo puedo comenzar a contar desde que NetworkStream.Write regrese, es decir, antes de que se hayan enviado los datos. Quiero comenzar a contar 10 segundos desde que los datos han salido de mi tarjeta de red.
La cantidad de datos y el tiempo de envío podrían variar: podría tardar 1 segundo en enviarlo, podría tardar 10 segundos en enviarlo, podría tardar un minuto en enviarlo. El servidor envía una respuesta cuando ha recibido los datos (es un servidor smtp), pero no quiero esperar para siempre si mis datos fueron mal formados y la respuesta nunca llegará, por lo que necesito saber si estoy ' Estoy esperando que se envíen los datos, o si estoy esperando que el servidor responda.
Es posible que desee mostrar el estado al usuario. Me gustaría mostrar "enviando datos al servidor" y "esperando respuesta del servidor". ¿Cómo podría hacerlo?
¿Has probado NetworkStream.Write con un paquete de 100MB? – Calmarius