ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-05-29 13:47:47  阅读:417  来源: 互联网

标签:linux windows sockets blocking 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有