Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Winsock2如何侦听()块?_Linux_Windows_Sockets_Blocking_Winsock2 - Fatal编程技术网

Linux Winsock2如何侦听()块?

Linux Winsock2如何侦听()块?,linux,windows,sockets,blocking,winsock2,Linux,Windows,Sockets,Blocking,Winsock2,说明: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

说明: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";
}
sockaddr\u in addr={0};
int addrlen=sizeof(addr);
插座插座,听;
if(-1==(sock\u listen=socket(AF\u INET、sock\u STREAM、IPPROTO\u TCP)))
{

cout从某种意义上说,这可能是一个阻塞调用,操作系统可能需要确保调用线程对套接字具有独占访问权,这需要某种锁,如果其他线程持有该锁,则反过来可能会阻塞调用方

编辑0:
一般来说,对操作系统的任何调用都是一个机会,用户线程可以被取消调度,以支持其他更高优先级的处理。这通常不是所谓的“阻塞”,而是“休眠”或“抢占”.

如果MSDN这么说,那就错了。这不是一个阻塞调用。没有什么要阻塞的,当然没有“外部网络事件”


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

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

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


内置的TCP/IP提供程序似乎从来不会阻塞
listen
,但似乎对此没有明确的保证。

我注意到,您复制的文档引用的是
listen
,而不是
listen
。它们可能是两个不同的函数吗?@Celada:不。它们都是相同的文件夹,用于锁定冲突的内容目的?我会称之为“原子”调用,而不是“阻塞”调用。是的,你可能是对的。在任何正常操作系统上,它肯定不是“阻塞”的。但Windows离“正常”还很远。将更改措辞,谢谢。我不知道……Windows Sockets SPI似乎没有禁止第三方协议提供商在
listen
上进行阻止。因此,我们现在需要的甚至是一个合理的建议,说明他们可能会阻止它的具体内容。+我不同意你关于NIC驱动程序的建议。
listen()
与网络无关。我可以想出一个稍微做作的例子:如果网络提供商透明地将套接字重定向到远程系统,它可能需要等待远程系统响应。我不知道有任何现有软件可以做这种事情,但它可能很有用;它会ld允许多台计算机共享一个IP地址,而不受NAT的限制。此外,虽然传统NIC不需要被告知
侦听
呼叫,但硬件卸载是否会改变这一点?是的,这可能是MSDN将该段落放在此处的原因。谢谢大家。