关于linux socket 编程 端口复用的理解

来源:互联网 发布:网络反侦查 编辑:程序博客网 时间:2024/06/05 04:44

端口复用的理解

在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用:

 int opt = 1; if(setsockopt(sockfd, SOL_SOCKET,SO_REUSEADDR, (const void *) &opt, sizeof(opt))){    perror("setsockopt");    return -1;}

那么什么是端口复用呢,如何理解呢,可以解释成如下:
在A机上进行客户端网络编程,假如它所使用的本地端口号是1234,如果没有开启端口复用的话,它用本地端口1234去连接B机再用本地端口连接C机时就不可以,若开启端口复用的话在用本地端口1234访问B机的情况下还可以用本地端口1234访问C机。若是服务器程序中监听的端口,即使开启了复用,也不可以用该端口望外发起连接了。

SO_REUSEADDR和SO_REUSEPORT

SO_REUSEADDR提供如下四个功能:

SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的        本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址            即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即            可。这一般不用于TCP服务器。SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端            口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套            接口而言(TCP不支持多播)。

SO_REUSEPORT选项有如下语义:

此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行。如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。

使用这两个套接口选项的建议:

在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;

当编写一个同一时刻在同一主机上可运行多次的多播应用程序时,设置SO_REUSEADDR选项,并将本组的多播地址作为本地IP地址捆绑。

setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nOptval , sizeof(int)) < 0)

Q:编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思?A:这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能。

参考链接:
http://blog.163.com/wangdong8213@126/blog/static/458523662012109694314/
http://blog.csdn.net/xsckernel/article/details/8159292

2 0
原创粉丝点击