¿Es seguro el subproceso Socket.SendAsync con seguridad?
-
22-07-2019 - |
Pregunta
Estaba jugando con la comunicación TCP de Silverlight y me vi obligado a usar la clase System.Net.Sockets.Socket que, en el tiempo de ejecución de Silverlight, solo tiene métodos asincrónicos.
Me preguntaba ¿qué sucede si dos hilos llaman a SendAsync en una instancia de Socket en muy poco tiempo, uno del otro?
Mi única preocupación es no tener bytes entremezclados pasando por el canal TCP.
Siendo un método asíncrono supongo que el mensaje se coloca en una cola desde la que se descuelga un solo hilo para que no sucedan tales cosas (mezclando el contenido del mensaje en el cable).
Pero no estoy seguro y el MSDN no indica nada en la descripción del método. ¿Alguien está seguro de esto?
EDIT1: No, bloqueando un objeto antes de llamar a SendAsync como:
lock(this._syncObj)
{
this._socket.SendAsync(arguments);
}
no ayudará, ya que esto serializa las solicitudes para enviar datos, no los datos realmente enviados.
Solución
Para llamar a SendAsync
primero debe haber llamado a ConnectAsync
con una instancia de SocketAsyncEventArgs
. Es la instancia de SocketAsyncEventArgs
que representa la conexión entre el cliente y el servidor. Llamar a SendAsync
con la misma instancia de SocketAsyncEventArgs
que acaba de usarse para una llamada pendiente a SendAsync
dará como resultado una excepción.
Es posible realizar múltiples llamadas pendientes a SendAsync
del mismo objeto Socket
pero solo usando diferentes instancias de SocketAsyncEventArgs
. Por ejemplo (en un universo paralelo donde esto podría ser necesario), podría estar haciendo múltiples publicaciones HTTP en el mismo servidor al mismo tiempo pero en diferentes conexiones. Esto es perfectamente aceptable y normal, ni el cliente ni el servidor se confundirán acerca de qué paquete es cuál.