¿Recv es bloqueante o no bloqueante?
Si las funciones de programación de red como recv son bloqueantes (síncronas) o no bloqueantes (asincrónicas) depende de si el socket socket() creado antes de llamar a la función recv es bloqueante o no bloqueante. El socket está configurado en modo de bloqueo cuando se crea de forma predeterminada; si desea configurar el socket en modo sin bloqueo, puede configurarlo en modo sin bloqueo cuando se crea el socket, luego la función recv es sin bloqueo.
Puede configurar el socket para que no se bloquee mediante los siguientes métodos:
1. La plataforma Linux puede especificar que el socket sea asíncrono (sin bloqueo) cuando se utiliza el socket. () para crear el socket:
int socket(int domain, int type, int protocolo);
Establezca el indicador SOCK_NONBLOCK en el tipo de parámetro, por ejemplo:
p>
int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
2. El socekt devuelto por la función aceptar() en plataformas Windows y Linux también proporciona un bloqueo. Función Accept4(), que puede configurar directamente el socket para el modo sin bloqueo:
int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int Accept4. (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
Simplemente configure los últimos indicadores de parámetro de Accept4() en SOCK_NONBLOCK.
3. Además de configurar el socket en modo sin bloqueo al crear el socket, también puede configurarlo mediante las siguientes funciones:
La plataforma Linux puede llamar al fcntl( ) o función ioctl(), por ejemplo:
fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);
ioctl(sockfd, FIONBIO, 1) ; //1: sin bloqueo 0: Bloqueando
La plataforma Windows puede llamar a la función ioctlsocket:
int ioctlsocket(
_In_ SOCKET s, p>
_In_ long cmd,
_Inout_ u_long *argp
);
Establezca el parámetro cmd en FIONBIO, *argp=0 significa que es configurado en modo de bloqueo y *argp no es 0 Establecido en modo sin bloqueo. Sin embargo, una cosa a tener en cuenta en la plataforma Windows es que después de llamar a la función WSAAsyncSelect() o WSAEventSelect() en un socket y luego llamar a la función ioctlsocket() para configurar el socket en modo de bloqueo, primero debe fallar. llame a WSAAsyncSelect() para configurarlo. El parámetro lEvent es 0 o llame a WSAEventSelect() para configurar el parámetro lNetworkEvents en 0 para deshabilitar WSAAsyncSelect() o WSAEventSelect() respectivamente. Llame a ioctlsocket() nuevamente para configurar el socket en modo de bloqueo para tener éxito. . Porque llamar a la función WSAAsyncSelect() o WSAEventSelect() configurará automáticamente el socket en modo sin bloqueo.