目录
1.什么是端口复用?
2.多个socket可以绑定同一个端口吗?
3.绑定同一端口的多个套接字如何接收数据?
4.SO_REUSEADDR和SO_REUSEPORT选项设置
5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?
5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。
5.2 程序重启后后,端口未释放导致程序重启异常。
1.什么是端口复用?
端口复用是指多个套接字绑定到同一个端口,多个套接字绑定同一个端口会涉及到多个套接字的竞争关系和合作关系。
图 1 端口复用
竞争关系:可以理解为哪些套接字能绑定这个端口,哪些套接字则不能绑定这个端口。
合作关系:可以理解为怎样才能让更多的套接字绑定这个端口,哪些套接字有优先权等。
2.多个socket可以绑定同一个端口吗?
多个套接字默认情况是不可以绑定同一个端口。
设置过套接字选项(SO_REUSEADDR,SO_REUSEPORT)的套接字可以在某些情况下绑定同一个套接字,可以从UDP和TCP两种情况去讨论:
- UDP情况
情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。
情况2:两个套接字源IP地址相同,如果两个套接字SO_REUSEADDR或者SO_REUSEPORT都设置为1,可以绑定同一个端口。
情况3:两个套接字源IP地址相同,除了情况2可以绑定同一个端口,其他情况都不能绑定同一个端口,通常第二个套接字会提示bind错误。
- TCP 情况
情况1:两个套接字只要源IP地址不一样,可以绑定同一个端口,不管SO_REUSEADDR和SO_REUSEPORT设置为多少都一样。
情况2:两个套接字源IP地址相同,只要有一个套接字设置SO_REUSEPORT为0,就不能绑定同一个端口,通常第二个套接字会提示bind错误。
UDP套接字和TCP套接字可以绑定同一个端口,UDP和TCP端口号没有任何关系。
3.绑定同一端口的多个套接字如何接收数据?
UDP接收数据分析
a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最后进行绑定操作的套接字优先收到数据。
b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。
c.都是绑定INADDR_ANY地址的套接字,最后进行绑定操作的套接字优先收到数据。
TCP接收数据分析
a.绑定真实地址(除INADDR_ANY之外的地址)的套接字,最先进行绑定操作的套接字优先收到数据。
b.绑定了INADDR_ANY地址的套接字需等绑定真实地址的套接字处理完才有可能收到数据。
c.都是绑定INADDR_ANY地址的套接字,最先进行绑定操作的套接字优先收到数据。
4.SO_REUSEADDR和SO_REUSEPORT选项设置
int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
int on = 1;
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
- 设置端口复用套接字选项需要在调用bind函数之前
- SO_REUSEADDR和SO_REUSEPORT套接字选项级别(level)为SOL_SOCKET
- 选项值:on=0 关闭选项,on:=1 开启选项
5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用?
5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。
TCP套接字处于TIME_WAIT状态,套接字资源还未释放,端口也未释放,需要设置端口复用才能进行重复绑定。文章来源:https://www.toymoban.com/news/detail-725930.html
5.2 程序重启后,端口未释放,导致程序重启绑定失败,服务器程序常见。
这种情况在服务器重启时比较常见,所以需要设置端口复用来解决。文章来源地址https://www.toymoban.com/news/detail-725930.html
到了这里,关于socket端口复用之TCP和UDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!