linux - How does Winsock2 listen() blocks? -
msdn says : listen() blocking call. code snippet function in have used listen() shown below:
sockaddr_in addr = {0}; int addrlen = sizeof(addr); socket sock_listen; if(-1 == (sock_listen = socket(af_inet, sock_stream, ipproto_tcp))) { cout<<"error"; } addr.sin_family = af_inet; /* network byte ordered address loopback */ addr.sin_addr.s_addr= inet_addr("127.0.0.1"); /* let service provider assign unique port dynamic client port range */ addr.sin_port = 0; if(-1 == bind(sock_listen, (const sockaddr *)&addr, addrlen)) { closehandle((handle)sock_listen_fd); cout<<"error"; } if(-1 == getsockname(sock_listen, (sockaddr *)&addr, &addrlen)) { closehandle((handle)sock_listen); cout<<"error"; } u_long mode = 0; if(socket_error == ioctlsocket(sock_listen, fionbio, &mode)) { cout<<"ioctl failed"; } if(socket_error == listen(sock_listen, 1)) { cout<<"listen error"; } cout<<"passed listen"; if(socket_error == (s = acl_accept(sock_listen_fd, null, null))) { cout<<"accept error"; } by default socket handle created blocking type. inorder further ensure called ioctlsocket() make socket handle blocking type.
the output : passed listen
so, thread not blocking @ listen(), instead blocks on accept according knowledge, right way. in linux man page explained :
listen() marks socket referred socket fd passive socket, i.e, socket used accept incoming connection requests using accept()
then why msdn says listen blocking winsock call. mean internal waiting event?
all documentation says listen might block, not will. might blocking briefly, e.g., wait nic device driver complete existing activity.
windows sockets allows installation of third-party providers support additional protocols or existing protocols features. since winsock spi not prohibit third-party providers blocking on listen, applications should follow advice provided msdn regards apcs , nested winsock calls.
it seems built-in tcp/ip provider never blocks on listen afaik there no explicit guarantee of this.
Comments
Post a Comment