La diferencia entre enchufes con bloqueo y enchufes sin bloqueo
1. Operación de lectura
Para los sockets con bloqueo, cuando no hay datos en el búfer de recepción del socket, las llamadas de lectura se bloquearán hasta que se obtengan datos. llega y no regresa. Cuando la cantidad de datos en el búfer del socket es menor que la cantidad de datos que se espera leer, se devuelve el número real de bytes leídos. Cuando la cantidad de datos en el búfer de recepción del socket es mayor que la cantidad de bytes que se espera leer, se lee la cantidad de bytes que se espera leer y se devuelve la longitud real leída.
Para sockets sin bloqueo, la llamada de lectura regresa inmediatamente independientemente de si hay datos en el buffer de recepción del socket. Hay datos en el búfer de recepción, que es la misma situación cuando hay datos en el socket de bloqueo. Si no hay datos en el búfer de recepción, el número de error devuelto es EWOULDBLOCK, lo que indica que la operación debería haberse bloqueado. pero debido a que el socket es un socket sin bloqueo, regresa inmediatamente. Si esto sucede, puedes intentar continuar leyendo la próxima vez. Si el valor de retorno es cualquier otro valor negativo, indica un error de lectura.
2. Operación de escritura
Para las operaciones de escritura, el principio es similar. Un socket sin bloqueo devolverá directamente el número de error EWOULDBLOCK al enviar espacio de búfer, es decir, no hay. espacio para escribir datos, si el número de error es otro valor, indica que el envío falló. Si el búfer de envío tiene suficiente espacio o no para copiar todos los datos que se van a enviar, se copian los primeros N datos que caben y se devuelve el número real de bytes copiados.
Para bloquear sockets, si no hay espacio o es insuficiente en el búfer de envío, la operación de escritura se bloquea; si hay suficiente espacio, todos los datos se copian al búfer de envío y se devuelven.
3. Establezca una conexión
En el modo de bloqueo, connect primero envía una solicitud SYN al servidor. Cuando el cliente recibe la confirmación SYN del servidor, connect regresa. De lo contrario, seguirá bloqueándose.
En el modo sin bloqueo, conectar habilitará el protocolo de enlace de tres vías del protocolo TCP, pero la función de conexión no esperará a que se establezca la conexión antes de regresar, sino que regresará inmediatamente. El código de error devuelto es EINPROGRESS, lo que indica que hay un proceso en curso.
4. recibir
conectar
Para los sockets monitoreados mediante métodos de bloqueo, aceptar se bloqueará cuando no se establezca ninguna conexión en la cola de conexiones hasta regresar solo cuando haya hay una conexión disponible.
Cuando se utiliza un socket de escucha sin bloqueo, regresará inmediatamente si no hay conexión. Cuando no hay conexión, el código de error devuelto es EWOULDBLOCK, lo que significa que debería estar bloqueando.
.