转载:

http://www.cppblog.com/aa19870406/archive/2012/07/12/183018.html

http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html

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

1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态

2、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地址捆绑。

    if (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 选项非常有用。必须意识到,此时任何非期望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能。

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使用 SO_REUSEADDR 选项。【2】

【1】 http://topic.csdn.net/u/20090103/16/a0414edb-b289-4c72-84da-39e155e8f4be.html

【2】

以下博客对这个问题进行了对答式的解答:

http://blog.sina.com.cn/s/blog_53a2ecbf010095db.html

【3】 http://www.sudu.cn/info/html/edu/20050101/296180.html

SO_REUSEADDR相关推荐

  1. linux socket 端口复用 SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回&quo ...

  2. 实战测试SO_REUSEADDR选项

    设置SO_REUSEADDR选项,对应TCP套接字处于TIME_WAIT状态下的socket可以重复绑定实用,看代码吧. 服务端: #include <unistd.h> #include ...

  3. SO_REUSEADDR和SO_REUSEPORT

    前言 基本概念: SO_REUSEADDR套接字选项能起到以下4个不同的功用: (1)SO_REUSEADDR允许启动一个监听服务器并捆绑众所周知端口,即使以前建立的该端口用作它们的本地端口的连接仍存 ...

  4. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

    1. SO_REUSEADDR 假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑 ...

  5. socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF

    From: http://blog.csdn.net/jasonliuvip/article/details/22591531 最近在看<linux高性能服务器编程>,在此做个日记,以激励 ...

  6. TCP/IP学习笔记-Qt中的ReuseAddressHint以及SO_REUSEADDR,以为组播常用场景分析

    最近在看一个局域网聊天的源码(Qt做的) 发现大佬用了这样的代码: udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::Re ...

  7. TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项

    基本概念: SO_REUSEADDR套接字选项能起到以下4个不同的功用: (1)SO_REUSEADDR允许启动一个监听服务器并捆绑众所周知端口,即使以前建立的该端口用作它们的本地端口的连接仍存在. ...

  8. SO_REUSEADDR SO_REUSEPORT 解析

    首先我们需要了解一些基本知识,一个TCP/UDP连接是被一个五元组确定的{源地址,源端口,协议,目的端口,目的地址}. 因此,任何两个连接都不可能拥有相同的五元组,否则系统将无法区别这两个连接. 当使 ...

  9. C/C++端口复用SO_REUSEADDR(setsockopt参数)

    端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口.这种情况下如果设定了端口复用,则新启动的服务器进程可以直接绑定端口.如果没有设定端口复用,绑定会失败 ...

最新文章

  1. java丑数算法_LintCode Java算法练习(4)-----丑数II
  2. python 清空所有对象_Python编程思想(7):列表的增删改操作
  3. H5开发的web APP和原生APP的区别
  4. python伪装浏览器https_python伪造HTTP-REFERER
  5. 【NLP】探索NLP模型可解释性的7种姿势
  6. 搭建nginx+php后访问不到项目
  7. conda指定路径_导出不带前缀变量的conda环境,该变量显示executab的本地路径
  8. 【论文阅读】基于未知传播模型的信息源检测问题 2017年AAAI国际先进人工智能协会
  9. HttpClient4.x之Get请求示例
  10. 货物贸易外汇监测系统 企业版_能源在线监测系统对用能企业的优势
  11. C语言编程规范(排版)
  12. 准备mybatis-spring
  13. 单个产品出库扣减库存
  14. 高德地图使用——定位功能
  15. linux中UDP编程
  16. VGA线材说明与鉴别详解
  17. 使用邮件合并批量制作工资条并进行发送邮件
  18. 关于SRE方法论的一些笔记
  19. id-mapping 理解和实现
  20. 【转载】巴菲特:比能力更重要的是靠谱

热门文章

  1. mysql 开发基础系列22 SQL Model(带迁移事项)
  2. 简述 Spring Cloud 是什么
  3. Linux系统开机自启流程
  4. 玩转CSS选择器(一) 之 使用方法介绍
  5. 点对点 客户端-服务器 聊天程序
  6. Kickstart之添加自动化脚本
  7. 【BZOJ】1679: [Usaco2005 Jan]Moo Volume 牛的呼声(数学)
  8. Java 基础【09】你的多继承纳?
  9. Windows Server 2008 R2 之三十故障转移群集(二)
  10. 小程序 node.js mysql_基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)...