请问SOCKET编程里面,如何保证所选端口没被其他程序占用?
在SOCKADDR_IN这个结构中需要设置端口号,那么我该如何知道我设的端口号有没有被其他程序占用呢?
[解决办法]
两种方法, 根据需求使用:
1, 直接connect/sendto, 由内核bind在一个端口.
2, 主动bind在一个端口, 对于TCP只要对端IP+PORT的组合不重复, 那么就不会出现问题, 因为TCP是4元组确定一个连接。 对于UDP,bind在同一个端口的行为我没有尝试过。
我提到的两种工作方式都是被实际应用过的,典型的就是FTP了。
FTP服务端实现在21端口bind监听,解析客户端命令。对于每一个希望上传或下载文件的客户端,客户端首先bind 0由内核指定一个port,然后通过21端口提交port。而服务端对于每一个客户端重复的bind在20端口,主动connect客户端通过21端口提交的PORT,连接到客户端主动connect服务端21端口时候使用的IP。
因为TCP是四元组,服务端重复bind 20情况下,只要客户端IP+PORT都不同即可,而这一点是可以实现的,因为客户端通过bind 0由内核绑定了唯一的PORT,而不同的机器拥有不同的IP,那么IP+PORT一定是世界唯一的,所以只要FTP客户端是正常实现的,都是可以正常与FTP服务端交互的。
以上我解释的是某一些FTP服务端的实现,也就是多余的bind在20端口,其实完全可以直接connect客户端的临时port,所以这需要在服务端设置SO_REUSEADDR。 FTP服务端的不同实现对客户端是透明的,客户端不需要变动。 也有一些FTP服务端是不重复bind 20的,避免了SO_REUSEADDR问题, 但同时也引入了新的问题,就是大量的PORT处在TIME_WAIT状态,有点浪费服务器端口,不过优化内核这都不是问题。
楼主有具体问题可以具体说,可以帮你解答一下。