`
stephen830
  • 浏览: 3010148 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

setsockopt中参数之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 选项。

 

 

freebsd与linux下bind系统调用小结

只考虑AF_INET的情况(同一端口指ip地址与端口号都相同)
1.freebsd支持SO_REUSEPORT和SO_REUSEADDR选项,而linux只支持SO_REUSEADDR选项。
2.freebsd下,使用SO_REUSEPORT选项,两个tcp的socket可以绑定同一个端口;同样,使用SO_REUSEPORT选项,两个udp的socket可以绑定同一个端口。
3.linux下,两个tcp的socket不能绑定同一个端口;而如果使用SO_REUSEADDR选项,两个udp的socket可以绑定同一个端口。
4.freebsd下,两个tcp的socket绑定同一端口,只有第一个socket获得数据。
5.freebsd下,两个udp的socket绑定同一端口,如果数据包的目的地址是单播地址,则只有第一个socket获得数据,而如果数据包的目的地址是多播地址,则两个socket同时获得相同的数据。
6.linux下,两个udp的socket绑定同一端口,如果数据包的目的地址是单播地址,则只有最后一个socket获得数据,而如果数据包的目的地址是多播地址,则两个socket同时获得相同的数据。

 

 

分享到:
评论

相关推荐

    setsockopt()改善程序的健壮性

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL)); ``` 通过设置`SO_REUSEADDR`为`TRUE`,即使端口仍然处于TIME_WAIT状态,也可以重用同一个端口。 #### 2. 防止linger状态 在...

    setsockopt

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&bReuseaddr, sizeof(BOOL)); ``` 2. **禁用连接保持(SO_DONTLINGER)** 当套接字被关闭时,可能会有连接保持行为,即等待一段时间才完全释放...

    支持IPv4和IPv6的TCPserver与client代码

    在IT行业中,网络通信是至关重要的部分,而TCP(传输控制协议)作为互联网协议栈中的核心组件,负责在客户端和服务器之间提供可靠的数据传输。IPv4和IPv6则是两种主要的互联网地址协议,前者是目前广泛使用的,后者...

    setsockopt函数使用说明

    `setsockopt`函数是计算机网络编程中的一个重要组成部分,主要用于设置套接字选项,它允许程序在套接字层上设置各种参数,以控制网络通信的行为。这个函数在跨平台的Socket API中广泛使用,适用于多种操作系统,如...

    Socket选项设置含义[归类].pdf

    3. **参数option_name**:表示我们要设置的具体选项,如SO_DEBUG、SO_REUSEADDR等。 4. **参数option_value**:指向包含新选项值的缓冲区,根据option_name的值决定其含义。 5. **参数option_len**:表示option_...

    linux 网络编程 socket选项的实现

    示例代码展示了如何在创建套接字后使用`setsockopt`设置`SO_REUSEADDR`选项,以便允许在TIME_WAIT状态下立即重用套接字地址。然后,代码进行套接字绑定、监听和接受连接。 总之,Linux网络编程中的Socket选项提供了...

    Linux下Socket编程的端口问题 ( Bind(): Address already in use ) PDF版

    1. **使用SO_REUSEADDR**:在调用`bind()`函数之前,先调用`setsockopt()`函数设置`SO_REUSEADDR`选项。具体实现方式如下: ```c #include // 创建套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); // ...

    Linux下socket设置.pdf

    以上设置都是通过`setsockopt`函数实现的,它允许对Socket的各种参数进行细粒度控制。理解并正确使用这些选项,能有效优化Socket通信的性能和可靠性,适应不同场景的需求。在实际编程中,应根据应用程序的具体需求来...

    liunx课件关于shell

    Linux Shell编程是Linux系统管理与自动化任务中的核心技能之一。Shell是Linux操作系统中用户与内核交互的命令解释器,它提供了用户与操作系统之间的一种接口。通过编写Shell脚本,我们可以自动化一系列命令,实现...

    socket_recv函数使用心得.

    * SO_REUSEADDR:绑定套接字用到。套接字正常关闭或异常退出后的一段时间内,端口依然维持原来的绑定状态,设置此选项后避免。 * SO_TYPE:获取套接字的类型。SOCK_DGRAM、SOCK_STREAM… * SO_ACCEPTCONN:检测套接...

    linux 网络驱动开发经验收集

    在Linux网络驱动开发中,了解和掌握套接字选项(setsockopt)是至关重要的。套接字选项是控制网络连接行为的关键机制,它们允许应用程序在创建套接字后调整各种网络参数,以满足特定的需求或优化性能。在进行Linux内核...

    Linux下Socket编程入门例子

    在这个例子中,`SO_REUSEADDR` 选项允许套接字在被关闭后立即重用地址,避免了TIME_WAIT状态带来的问题。 现在,我们分析给出的代码: - `create_tcp_connection` 函数用于创建一个TCP连接到指定的IP和端口。它...

    socket 编程问题一览(01)1

    在这个话题中,我们将探讨几个关键的步骤和概念,包括`socket()`、`bind()`、`TIME_WAIT`状态以及`SO_REUSEADDR`选项。 首先,`socket()`函数用于创建一个socket,返回一个描述符,这个描述符就像文件描述符一样,...

    socket服务器和客户端的编程

    - **设置选项**:`setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))` 设置了套接字选项,使得服务器可以重用地址。 - **绑定地址**:`bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct ...

    win32linux相互移植网络编程需要注意的地方(转).pdf

    可通过`setsockopt`启用`SO_REUSEADDR`选项来允许立即重用。 8. **发送数据**: 在Linux下,使用`send`时,为避免因发送错误导致程序退出,可以设置最后一个参数为`MSG_NOSIGNAL`,防止发送异常信号。或者,可以...

    c socket pyton socket

    int ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&re_use_addr, sizeof(int)); ``` 此外,还可以设置发送和接收超时选项(`SO_SNDTIMEO`, `SO_RCVTIMEO`)以控制数据传输的等待时间。 ### 4. 处理...

    ComputerNetwork:基于TCP的多用户聊天应用程序

    计算机网络 基于TCP的多用户聊天应用程序2018 介绍 :此应用程序是在Ubuntu(Linux x86_64)上的Python3.6.5中编程的...2)setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 此函数显示创建的套接字的规范。

    linux socket 实现原理

    这些操作允许程序员设置一些影响套接字行为的特殊选项,比如SO_RCVTIMEO和SO_REUSEADDR等。 值得注意的是,Linux内核的socket实现是不断更新和优化的,随着内核版本的升级,相关代码和功能也会发生一些变化。因此,...

    Tcpip通信源代码-c语言

    - `setsockopt`函数用于设置套接字选项,此处设置`SO_REUSEADDR`允许重新绑定已关闭的端口。 4. **绑定端口**: ```c sockaddr_in servaddr; memset(&servaddr, 0, sizeof(sockaddr_in)); servaddr.sin_family...

Global site tag (gtag.js) - Google Analytics