系统相关
首页 > 系统相关> > linux – Winsock2如何监听()阻止?

linux – Winsock2如何监听()阻止?

作者:互联网

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()来使套接字句柄阻塞类型.

The output is : Passed listen

所以,线程在listen()时没有阻塞,而是根据我的知识阻止接受,这是正确的方式.同样在Linux MAN page,它清楚地解释了:

listen() marks the socket referred to by socket fd as a passive socket, i.e, as a socket that will be used to accept incoming connection requests using accept()

那么为什么MSDN说listen是一个阻塞的Winsock调用.他们只是意味着任何内部等待某事件?

解决方法:

所有文档都说听力可能会阻止,而不是肯定会阻止.它也可能只是非常短暂地阻塞,例如,等待NIC设备驱动程序完成现有活动.

Windows套接字允许安装第三方提供程序以支持其他协议或具有额外功能的现有协议.由于Winsock SPI不禁止第三方提供商阻止侦听,因此应用程序应遵循MSDN提供的有关APC和嵌套Winsock调用的建议.

内置的TCP / IP提供程序似乎永远不会阻止侦听,但AFAIK没有明确的保证.

标签:linux,windows,sockets,blocking,winsock2
来源: https://codeday.me/bug/20190529/1178260.html