【问题标题】:SO_LINGER and closing sockets(WINSOCK)SO_LINGER 和关闭套接字(WINSOCK)
【发布时间】:2011-02-19 03:53:26
【问题描述】:

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

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

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

有什么帮助吗? 谢谢

【问题讨论】:

    标签: c winsock so-linger


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 )。请注意,您可以建立的出站连接数有一些单独的限制(您可能更感兴趣),但默认情况下约为 4000,可以通过设置MAX_USER_PORT 进行调整,请参见此处:Maximum number of concurrent TCP/IP connections - Win XP SP3更多细节。

      【讨论】:

      • 忘了提一件事。当我单线程运行它时,这个问题不会发生 - 它都连接正确。当我同时运行 2 个及以上发送线程(每个打开 16 个不同的套接字以发送到 16 个不同的服务器)时,某处连接失败 - 它会有所不同。
      • 您是否绑定了客户端套接字?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多