socket IO端口复用

简介: socket IO端口复用

在网络应用中(如Java Socket Server),当服务关掉立马重启时,不少时候会提示端口仍被占用(因端口上有处于TIME_WAIT的链接)。此时可经过 SO_REUSEADDR 参数( socket.setReuseAddress(true); )来使得服务关掉重启时立马可以使用该端口,而不是提示端口占用。

若是端口忙,但TCP状态位于 TIME_WAIT ,能够重用 端口。若是端口忙,而TCP状态位于其余状态,重用端口时依旧获得一个错误信息, 抛出“Address already in use: JVM_Bind”。若是你的服务程序中止后想当即重启,不等60秒,而新套接字依旧 使用同一端口,此时 SO_REUSEADDR 选项很是有用。必须意识到,此时任何非期 望数据到达,均可能致使服务程序反应混乱,不过这只是一种可能,事实上很不可能。

在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机。如果服务器程序中监听的端口,即便开启了复用,也不能够用该端口望外发起链接了。

编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思?

A:这个套接字选项通知内核,若是端口忙,但TCP状态位于 TIME_WAIT ,能够重用端口。若是端口忙,

而TCP状态位于其余状态,重用端口时依旧获得一个错误信息,指明"地址已经使用中"。若是你的服务程序中止

后想当即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR 选项很是有用。必须意识到,此时任何

非指望数据到达,均可能致使服务程序反应混乱,不过这只是一种可能,事实上很不可能。

当两个socket的address和port相冲突,而你又想重用地址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只有二者之一有这个特性仍是有问题的。

一、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。

二、SO_REUSEADDR容许同一port上启动同一服务器的多个实例(多个进程)。但每一个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器能够测试这种状况。

三、SO_REUSEADDR容许单个进程绑定相同的端口到多个socket上,但每一个socket绑定的ip地址不一样。这和2很类似,区别请看UNPv1。

四、SO_REUSEADDR容许彻底相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP

相关文章
|
1月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
54 0
|
3月前
|
存储 Linux 调度
io复用之epoll核心源码剖析
epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);
72 0
io复用之epoll核心源码剖析
|
3月前
|
存储 网络协议
TCP服务器 IO多路复用的实现:select、poll、epoll
TCP服务器 IO多路复用的实现:select、poll、epoll
36 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
59 0
|
13天前
|
安全 程序员
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
63 0
|
3月前
|
网络协议 架构师 Linux
一文说透IO多路复用select/poll/epoll
一文说透IO多路复用select/poll/epoll
159 0
|
3月前
|
网络协议 Linux
2.1.1网络io与io多路复用select/poll/epoll
2.1.1网络io与io多路复用select/poll/epoll
|
3月前
|
监控 Linux
IO多路复用,epoll和select的区别
IO多路复用,epoll和select的区别
20 0
|
3月前
|
网络协议 编译器 Linux
协程和IO多路复用
协程和IO多路复用
47 0
协程和IO多路复用