Winsock2如何侦听()块?

Winsock2如何侦听()块?,第1张

概述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"; }

默认情况下是一个创build为阻塞types的套接字句 为了进一步确保它被称为ioctlsocket()使套接字句柄阻塞types。

输出是:通过听

所以,这个线程在Listen()处没有被阻塞,而是根据我的知识阻塞了接受,这是正确的。 在linux MAN页面中也清楚地说明了这一点:

从C中的套接字读取消息

如何确定linux套接字在C ++中绑定的接口

Winsock:与SO_REUSEADDR的奇怪冲突

node.Js需要太多的TCP套接字

将uint16_t转换为char 以通过套接字(unix)发送

Listen()将套接字fd引用的套接字标记为被动套接字,也就是将套接字用作accept()来接受传入连接请求的套接字。

那么MSDN为什么说Listen是一个阻塞的Winsock调用。 他们只是指任何内部等待某个事件吗?

Office 2010中的VBA套接字连接

Nginx + uWsgi + Django'连接上行时拒绝权限(套接字)

ad hocnetworking中的UDP套接字(Ubuntu 9.10)

recvfrom()不返回收到的字节数

创buildSOCK_RAW套接字仅用于发送没有任何recvform()的数据

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

windows套接字允许安装第三方提供商以支持附加协议或具有额外功能的现有协议。 由于Winsock SPI不禁止第三方提供商阻止Listen ,因此应用程序应遵循MSDN就APC和嵌套Winsock调用提供的建议。

看起来内置的TCP / IP提供程序可能永远不会阻止Listen但AFAIK没有明确的保证。

从某种意义上说,这可能是一个阻塞调用, *** 作系统可能需要确保调用线程对套接字具有独占访问权限,这需要某种锁定,如果某个其他线程持有该锁定,则可能会阻止调用者。

编辑0:

一般来说,进入 *** 作系统的任何调用都是一个机会,使用户级线程可以被重新调度,以支持其他更高优先级的进程。 这通常不被称为“阻塞”,而是“睡觉​​”或被“抢占”。

如果MSDN说这是错误的。 这不是一个阻塞的电话。 没有什么可以阻止的,当然没有“外部网络事件”。

这样说的段落显然是复制到太多地方的样板。

总结

以上是内存溢出为你收集整理的Winsock2如何侦听()块?全部内容,希望文章能够帮你解决Winsock2如何侦听()块?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1292846.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-10
下一篇2022-06-10

发表评论

登录后才能评论

评论列表(0条)

    保存