如何检测Linux上的C端口是否已在使用?

时间:2010-11-21 13:53:12

标签: c linux sockets

我正在写一个简单的Web服务器。我想让用户设置服务器监听的端口, 但我怎么知道用户输入的端口是否已被使用?(如果我知道它已经在使用中,我可以告诉他们输入另一个。)

5 个答案:

答案 0 :(得分:8)

只需尝试bind到端口,如果失败,请检查EADDRINUSE中的errno。这是唯一的方法,因为要正确,任何此类检查必须是原子的。如果你做了一个单独的检查,然后在发现它没有被使用后尝试绑定到端口,另一个进程可能在中间时间绑定到端口,再次导致它失败。同样,如果您进行了单独检查并发现该端口已在使用中,则使用它的进程可能会在中间时间关闭端口,退出或崩溃,再次导致结果不正确。

所有这一切(我写一个长答案而不是一个简短答案的原因)是检查“我可以这样做吗?”的正确,有力的方法。几乎总是尝试做并检查失败。任何其他方法都可能导致竞争条件,并且在许多情况下竞争条件(尽管可能不是你的竞争条件)竞争条件是安全漏洞。

答案 1 :(得分:5)

bind()将失败:

  

成功时,返回零。出错时,返回-1,并正确设置errno。

     

EADDRINUSE   给定的地址已被使用。

答案 2 :(得分:0)

另一种方法:尝试连接localhost上的该端口。

答案 3 :(得分:0)

如果bind()显示一些错误

答案 4 :(得分:0)

只需创建一个套接字并调用bind()即可。如果bind()成功,则继续执行listen(),否则应执行一些错误处理过程,例如切换到默认端口,打印错误消息并等待用户交互,或者至少登录并退出。