C++ 无法绑定到本地端口-WSAEADDRINUSE

C++ 无法绑定到本地端口-WSAEADDRINUSE,c++,network-programming,port,bind,C++,Network Programming,Port,Bind,我们有一个Windows上的服务器应用程序无法绑定到本地端口3050,错误为WSAEADDRINUSE-Address已在使用中 但是,我已经使用SysInternals实用程序TCPView检查了该端口上没有进程正在侦听 请说明这背后的原因以及克服此问题的任何解决方法 提前感谢。在两种情况下会出现错误情况: 1另一个套接字已绑定到该地址 2最近关闭了绑定到该地址的套接字 在第一种情况下,我认为问题在于您在同一个程序中绑定到该端口号两次 在第二种情况下,我假设您的程序的前一次运行在测试前不到12

我们有一个Windows上的服务器应用程序无法绑定到本地端口3050,错误为WSAEADDRINUSE-Address已在使用中

但是,我已经使用SysInternals实用程序TCPView检查了该端口上没有进程正在侦听

请说明这背后的原因以及克服此问题的任何解决方法


提前感谢。

在两种情况下会出现错误情况:

1另一个套接字已绑定到该地址

2最近关闭了绑定到该地址的套接字

在第一种情况下,我认为问题在于您在同一个程序中绑定到该端口号两次


在第二种情况下,我假设您的程序的前一次运行在测试前不到120秒退出或崩溃。运行TCPView时,120秒已经过去。

该错误情况将在两种情况下发生:

1另一个套接字已绑定到该地址

2最近关闭了绑定到该地址的套接字

在第一种情况下,我认为问题在于您在同一个程序中绑定到该端口号两次


在第二种情况下,我假设您的程序的前一次运行在测试前不到120秒退出或崩溃。在运行TCPVIEW时,120秒已经过去。

< P>如果您可以访问基础C++代码,那么在调用绑定之前,您可以在套接字上使用SoSockopt与SOSReUSEADDR的参数。这将允许您的程序重新绑定到给定的端口,即使有一个以前程序运行的“逗留”的套接字。

< P>如果您有访问底层C++代码的能力,那么在调用绑定之前,您可以在套接字上使用SoSockopt与SOSReUSEADDR的参数进行连接。这将允许您的程序重新绑定到给定的端口,即使上一个程序运行时有一个套接字“延迟”。

欢迎使用堆栈溢出!netstat为该端口显示了什么?欢迎使用堆栈溢出!netstat为该端口显示了什么?谢谢Rob。我将验证上述条件。我已签入代码,似乎没有绑定到端口两次。此外,我尝试从3050-3054绑定到其他端口,但它在端口3055上绑定正确!但是,TCPView没有显示任何进程正在使用的这些端口。请推荐。谢谢罗布。我将验证上述条件。我已签入代码,似乎没有绑定到端口两次。此外,我尝试从3050-3054绑定到其他端口,但它在端口3055上绑定正确!但是,TCPView没有显示任何进程正在使用的这些端口。请提出建议。我相信只有在使用SO_REUSEADDR选项配置早期套接字时,这才可能实现?是的,您是正确的。我们的想法是,每次打开给定的套接字时都要使用此选项,这样当确实发生崩溃时,您不会在重新启动时遇到ADDRINUSE错误。@Gaurav不,您是不正确的。这适用于UDP。在TCP中,当旧连接的端口处于TIME\U WAIT状态时,会出现问题。只有新的套接字需要SO_REUSEADDR。我相信只有在使用SO_REUSEADDR选项配置早期的套接字时,这才可能实现?是的,您是正确的。我们的想法是,每次打开给定的套接字时都要使用此选项,这样当确实发生崩溃时,您不会在重新启动时遇到ADDRINUSE错误。@Gaurav不,您是不正确的。这适用于UDP。在TCP中,当旧连接的端口处于TIME\U WAIT状态时,会出现问题。只有新插座需要重新使用。