我正在写一个简单的Web服务器。 我想让用户设置服务器侦听的端口,但我怎么知道用户input的端口是否已经被使用?(如果我知道它已经在使用,我可以告诉他们input另一个端口一。)
只需尝试bind
到端口,如果失败,请检查errno
EADDRINUSE
。 这是唯一的方法,因为要正确的检查必须是原子的。 如果您执行了单独的检查,然后尝试在发现该端口未被使用后绑定到端口,则另一个进程可能会在间隔时间内绑定到该端口,并再次导致该端口失败。 同样,如果您执行了单独的检查并发现该端口已被使用,则正在使用该端口的进程可能会在间隔时间内关闭端口,退出或崩溃,从而导致结果不正确。
所有这一切(我写了一个长答案而不是简短答案的原因)在于,正确的,可靠的方法来检查“我能做这样那样的事吗? 几乎总是试图做到这一点,并检查失败。 任何其他方法都可能导致竞争条件,在很多情况下,竞争条件(尽管可能不是你的)也是安全漏洞。
bind()
会失败:
成功时返回零。 出错时,返回-1,并适当地设置errno。
EADDRINUSE给定的地址已被使用。
如果bind()显示一些错误
只要创建一个套接字并调用bind()。 如果bind()成功,则继续listen(),否则你应该执行一些错误处理程序,比如切换到默认的端口,打印错误信息并等待用户交互,或者至少是登录和退出。
另一种方法:尝试连接到localhost
上的端口。