C++ 在某些计算机上,WinSock closesocket()调用需要一秒钟的时间

C++ 在某些计算机上,WinSock closesocket()调用需要一秒钟的时间,c++,windows,winsock,closesocket,C++,Windows,Winsock,Closesocket,这个调用应该在很短的时间后返回,但在某些机器上,它莫名其妙地需要非常接近1秒的时间。有人见过这个问题吗。我使用的是环回地址,因此网络应该是不存在的。问题可能在window sockets实现中的某个地方。从操作系统的角度来看,调用closesocket(或CloseHandle)相当于释放驱动程序的“设备”对象。大多数驱动程序会立即(同步)处理此请求,必要时中止所有(潜在)未完成的I/O。然而,“愚蠢”的司机可能会阻止你,直到事情完成 这就是我要做的: 尝试(通过任务管理器)终止您的程序。终止

这个调用应该在很短的时间后返回,但在某些机器上,它莫名其妙地需要非常接近1秒的时间。有人见过这个问题吗。我使用的是环回地址,因此网络应该是不存在的。

问题可能在window sockets实现中的某个地方。从操作系统的角度来看,调用
closesocket
(或
CloseHandle
)相当于释放驱动程序的“设备”对象。大多数驱动程序会立即(同步)处理此请求,必要时中止所有(潜在)未完成的I/O。然而,“愚蠢”的司机可能会阻止你,直到事情完成

这就是我要做的:

  • 尝试(通过任务管理器)终止您的程序。终止它需要时间吗?(如果是的话-似乎是被司机锁上的)
  • 如果您正在谈论流套接字(即TCP或类似协议),请尝试使用
    SO\u DONTLINGER
    选项。也就是说,指定您不希望等待所有挂起的数据发送到对等方

可能是防病毒/防火墙软件在干扰?如果只是增加延迟,则防病毒/防火墙软件不是很有用。我已经关闭了防火墙,并且没有为病毒检查器运行常驻屏蔽。同样的行为。一些AV和安全产品有引入错误行为的倾向。如果您在其他方面遇到了问题,那么您可能需要将它们全部卸载—当然是在网络断开时再次检查。当然,出于同样的原因,问题可能是相关机器感染了某种形式的恶意软件。由于存在其他延迟,很难判断使用任务管理器终止进程是否需要1秒。因此,在这种特殊情况下,_DONTLINGER不应该有任何影响,因为没有数据通过套接字发送,它只是被建立然后关闭。因此,_DONTLINGER是指等待所有数据发送。@Jesse Pepper:除了发送未发送的数据外,TCP还有一个优雅地关闭连接的“仪式”,其中包括一些带有
FIN
数据包的乒乓球。我不确定,但可能
所以_DONTLINGER
也包括这个。即,使用此标志,它将中止与
RST