SO_延迟和关闭套接字(WINSOCK)

SO_延迟和关闭套接字(WINSOCK),c,winsock,so-linger,C,Winsock,So Linger,我正在编写一个多线程winsock应用程序,我在关闭套接字时遇到了一些问题。 首先,同时打开的插座数量是否有限制?比如说,一次就有32个插座 我在其中一个插座上建立连接,传递信息,一切正常。 问题是,当我断开套接字连接,然后重新连接到同一个目的地时,我会在SYN之后从服务器获得RST。 我没有服务器应用程序的代码,因此无法调试它 当我使用SO_LINGER时,它在每次会话结束时都会发送一个RST标志,这很有效。 但我不想这样结束我的关系。 当不使用SO_LINGER时,发送了一个FIN标志,但连

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

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

当我使用SO_LINGER时,它在每次会话结束时都会发送一个RST标志,这很有效。 但我不想这样结束我的关系。 当不使用SO_LINGER时,发送了一个FIN标志,但连接似乎没有真正关闭

有什么帮助吗?
谢谢

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


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

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

如果是这样,听起来服务器端的套接字仍然处于
TIME\u WAIT
状态,并且正在放弃新的连接尝试。通过绑定客户端套接字,您迫使服务器尝试并重用当前处于2MSL等待期的完全相同的连接,此时无法重用该连接,因此您看到了您看到的内容。通常不需要绑定客户端端口,停止绑定,您的问题很可能会消失

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


每个打开的套接字使用一些“非分页池”内存,套接字上的每个挂起的读或写请求也可能同时使用“非分页池”和在I/O期间在内存中锁定内存页(可以锁定的页数有限制)。也就是说,在Vista和更高版本上,可用的“无页面池”比早期版本的Windows多得多,即使如此,我还是在一个非常低规格的XP设备上实现了70000多个并发活动连接(请参见此处)。请注意,您可以建立的出站连接数有一些单独的限制(您可能更感兴趣),但默认情况下约为4000,可以通过设置
MAX\u USER\u PORT
进行调整,请参见此处:了解更多详细信息

忘了提一件事。当我单线程运行它时,这个问题不会发生-它所有连接都正常。当我同时运行2个及以上的发送线程(每个线程打开16个不同的套接字以发送到16个不同的服务器)时,在某个地方它无法连接-这是不同的。是否绑定客户端套接字?