MSDN говорит, что : Listen() — это блокирующий вызов. Фрагмент кода функции, в которой я использовал listen(), показан ниже:
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 for loopback */
addr.sin_addr.s_addr= inet_addr("127.0.0.1");
/* Let service provider assign a unique port from 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";
}
По умолчанию дескриптор сокета создается как тип блокировки. Чтобы дополнительно убедиться, что он вызвал ioctlsocket(), чтобы сделать тип блокировки дескриптора сокета.
Вывод: Пройдено прослушивание
Таким образом, поток не блокируется при прослушивании (), вместо этого он блокируется при принятии, что, насколько мне известно, является правильным способом. Также на странице Linux MAN ясно объясняется:
listen() помечает сокет, на который ссылается socket fd, как пассивный сокет, т. е. как сокет, который будет использоваться для приема входящих запросов на соединение с помощью accept().
Тогда почему MSDN говорит, что прослушивание является блокирующим вызовом Winsock. Имеют ли они в виду просто какое-то внутреннее ожидание какого-то события?
Listen
, а неlisten
. Возможно, это две разные функции? - person Celada   schedule 21.05.2013