3

我正在编写一个多线程的 Winsock 应用程序,并且在关闭套接字时遇到了一些问题。首先,同时打开的套接字数量是否有限制?让我们说像32个插座一样。

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

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

有什么帮助吗?谢谢

4

2 回答 2

2

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

您可能正在bind()将您的客户端套接字连接到固定端口。这可能是服务器拒绝您后续连接的原因。尝试普通的临时端口。

于 2010-05-13T16:07:23.967 回答
2

首先,我同意 Nikolai,您是否绑定了您的客户端套接字?

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

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

每个打开的套接字都使用一些“非分页池”内存,并且套接字上的每个挂起的读取或写入请求也可能同时使用“非分页池”并在 I/O 期间将内存页锁定在内存中(对可以锁定的页数)。也就是说,在 Vista 和更高版本上,可用的“非分页池”比在早期版本的 Windows 上要多得多,即便如此,我还是设法在一个相当低规格的 XP 机器上实现了超过 70,000 个并发活动连接(参见此处: http:/ /www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html)。请注意,您可以建立的出站连接数量有一些单独的限制(您可能更感兴趣),但是'MAX_USER_PORT最大并发 TCP/IP 连接数 - Win XP SP3了解更多详细信息。

于 2010-05-13T16:38:40.750 回答