【发布时间】:2013-05-14 18:10:04
【问题描述】:
MSDN 说: Listen() 是一个阻塞调用。我使用了 listen() 的函数的代码 sn-p 如下所示:
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()来使socket句柄阻塞类型。
输出是:通过听
所以,线程并没有在 listen() 处阻塞,而是在接受时阻塞,据我所知,这是正确的方法。在Linux MAN page 中也有明确的解释:
listen() 将 socket fd 引用的套接字标记为被动套接字,即将使用 accept() 接受传入连接请求的套接字
那为什么 MSDN 说 listen 是一个阻塞的 Winsock 调用。它们只是意味着任何内部等待某个事件吗?
【问题讨论】:
-
我注意到您复制的文档引用指的是
Listen,而不是listen。也许它们是两种不同的功能? -
@Celada :不。两者都是一样的
标签: linux windows sockets blocking winsock2