Comunicación de socket BeginReceive recibe datos de forma asincrónica y cuándo devolver la llamada Devolución de llamada
Después de trabajar con la comunicación asincrónica de socket durante un tiempo, me di cuenta de que tenía un malentendido sobre el tiempo de devolución de llamada de BeginReceive. Anteriormente, siempre pensé que recibir datos de forma asincrónica solo devolvería la llamada cuando el búfer estuviera lleno. Si es así, cuando el búfer del lado del servidor es mayor que los datos enviados por el cliente, los datos enviados por el cliente no se pueden procesar a tiempo (solo cuando el búfer está lleno). Esto obviamente no es razonable, así que hice la siguiente prueba:
Código de servidor:
Código de cliente:
Como puede ver, la recepción asincrónica en el servidor lado No más de 4 bytes a la vez. El cliente no limita la cantidad de bytes de datos enviados al mismo tiempo. (Observaciones: 1. Ejecute primero el servidor, luego el cliente 2. Utilice la codificación ASCII para enviar datos, cada carácter ocupa 1 byte 3. Utilice Socket.ReceiveBuffer para enviar datos. Socket.ReceiveBufferSize debe ser mayor que la longitud del búfer, de lo contrario, se obtendrán otros resultados)
1. La longitud de los datos enviados es la misma que la longitud del búfer de recepción y se realiza una devolución de llamada cuando se reciben todos los datos;
2. La longitud de los datos enviados es mayor que la longitud del búfer de recepción, devolución de llamada cuando el búfer está lleno, devolución de llamada cuando se reciben los datos;
3. menor que la longitud del búfer de recepción, devolución de llamada cuando se reciben los datos;
Si desea forzar manualmente la devolución de llamada de BeginReceive, MSDN proporciona los siguientes métodos:
Para cancelar un proceso pendiente BeginReceive, llama al método Close.