我正在编写一个简单的Web服务器。我想让用户设置服务器监听的端口,但是我该如何知道用户输入的端口是否已经被占用?(如果我知道它已经被占用,我可以告诉他们输入另一个端口。)
errno
中的EADDRINUSE
。这是唯一的方法,因为要正确进行任何此类检查必须是原子的。如果您进行了单独的检查,然后在发现它未被使用后尝试绑定到端口,则另一个进程可能会在介入时间内绑定到该端口,从而再次导致失败。同样,如果您进行了单独的检查并发现端口已被占用,则正在使用它的进程可能会在介入时间内关闭端口、退出或崩溃,从而再次使结果不正确。bind()
会失败:
成功时返回零。发生错误时,返回-1,并适当设置errno。
EADDRINUSE 给定地址已经在使用中。
如果bind()显示出错