SO_LINGER和关闭套接字(WINSOCK)

我正在写一个multithreading的winsock应用程序,我有一些关闭套接字的问题。 首先,是否有一些同时打开的sockets有限制? 让我们一起说32个sockets。

我在其中一个sockets上建立连接,并传递信息,一切正常。 问题是当我断开套接字然后重新连接到同一目的地时,我在SYN之后从服务器获得RST。 我没有服务器应用程序的代码,所以我无法调试它。

当我使用SO_LINGER并在每次会话结束时发送了一个RST标志 – 它起作用了。 但我不希望以这种方式结束我的联系。 当不使用SO_LINGER时,发送了FIN标志,但似乎连接并未真正关闭。

任何帮助? 谢谢

在Unix上,每个进程都有一个文件描述符限制 – 我猜测它是Windows的“句柄”。

您可能bind()您的客户端套接字bind()到固定端口。 这可能是服务器拒绝后续连接的原因。 尝试正常的短暂端口。

首先,我同意尼古拉,你绑定你的客户端套接字?

如果是这样,它听起来像服务器端的套接字仍然在TIME_WAIT并且正在丢弃新的连接尝试。 通过绑定客户端套接字,您迫使服务器尝试重用当前处于2MSL等待时间内的完全相同的连接,此时无法重复使用它,因此您可以看到您所看到的内容。 通常不需要绑定客户端端口,停止执行它,您的问题可能会消失。

其次,是的,Windows平台上的开放套接字数量有限制但它们与资源相关而不是某些硬编码数字。

每个打开的套接字使用一些“非页面缓冲池”内存,并且套接字上的每个挂起的读取或写入请求也可能同时使用“非页面缓冲池”并且在I / O期间将内存页锁定在内存中(对此有限制)可以锁定的页数)。 那说在Vista和后来有更多的“非分页池”可用比早期版本的Windows,甚至那时我已经设法在一个相当低的规格XP盒子上实现超过70,000个并发活动连接(见这里: http:/ /www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html )。 请注意,您可以建立的出站连接数有一些单独的限制(您可能更感兴趣),但默认情况下大约为4000,可以通过设置MAX_USER_PORT来调整此处: 最大并发TCP数/ IP连接 – Win XP SP3了解更多详情。