2013-01-24 63 views
1

我们有没有本地端口(3050)给错误的结合WSAEADDRINUSE - Address already in use.无法绑定到本地端口 - WSAEADDRINUSE

但是在Windows服务器应用程序,我一直在使用的Sysinternals工具(的TCPView)检查发现没有进程正在侦听该端口。

请提出什么是背后的原因和解决这个问题的任何解决方法。

在此先感谢。

+0

欢迎来到Stack Overflow! –

+0

netstat为该端口显示什么? – EJP

回答

5

即错误状态将在两个条件下发生:

1)的另一种插座已经绑定到该地址

2)绑定到该地址的插座最近关闭。

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

在第二种情况下,我想你的程序上一次运行在测试之前退出或坠毁的时间少于120秒。当你运行TCPView时,120秒已经过去了。

+0

感谢罗布。我会验证上述条件。 – Gaurav

+0

我检查了代码,它似乎没有绑定到端口两次。此外,我尝试绑定到3050-3054的其他端口,但是它在端口3055上正确绑定!但是,TCPView不显示任何进程正在使用的这些端口。 请建议。 – Gaurav

1

如果您有权访问底层C++代码,则可以在调用bind()之前,在套接字上使用setsockopt()和参数SO_REUSEADDR。这将允许你的程序重新绑定到给定的端口,即使有一个来自之前程序运行的“套接字”套接字。

+0

我相信这只有在使用SO_REUSEADDR选项配置较早的套接字时才有可能? – Gaurav

+0

是的,你是对的。这个想法是在每次打开给定套接字时使用此选项,因此当发生崩溃时,在重新启动时不会遇到ADDRINUSE错误。 – ryanbwork

+0

@Gaurav不,你不正确。这适用于UDP。当旧的连接端口处于TIME_WAIT状态时,TCP出现问题。只有新的套接字需要SO_REUSEADDR。 – EJP

相关问题