地址与端口重用


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

setsockopt()

函数原型

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int getsockopt(int sockfd, int level, int optname,
                      void *optval, socklen_t *optlen);

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等效

端口复用操作

int opt = 1;
setsockopt(listenFd, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(opt));

注意

  • 对于用于监听的端口,即使开启了复用,也不能用该端口往外发起连接了,只能复用 来 进行监听。
  • 在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;
  • 在所有TCP服务器中,在调用listen之前设置SO_REUSEADDR套接口选项;

地址复用操作

int opt = 1;
setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));

参考博客

csdn


文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录