【问题标题】:What are the use cases of SO_REUSEADDR?SO_REUSEADDR 的用例是什么?
【发布时间】:2010-10-09 08:07:01
【问题描述】:

我使用SO_REUSEADDR 让我的服务器终止并重新启动,而不会抱怨套接字已在使用中。我想知道SO_REUSEADDR 是否还有其他用途?有没有人将套接字选项用于上述目的以外的用途?

【问题讨论】:

    标签: c sockets tcp udp


    【解决方案1】:

    对于 TCP,主要目的是在同一地址重新启动已关闭/终止的进程。

    需要该标志,因为端口进入TIME_WAIT 状态以确保传输所有数据。

    如果两个套接字绑定到相同的接口和端口,并且它们是同一个多播组的成员,则数据将被传递到两个套接字。

    我想另一种用途是尝试拦截数据的安全攻击。

    (Source)


    对于 UDPSO_REUSEADDR 用于多播。

    如果bind() 前面有以下前缀,则可以有多个进程绑定到同一个SOCK_DGRAM UDP 端口:

    int one = 1;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    

    在这种情况下,每个传入的多播或广播 UDP 数据报都将发送到 共享端口被传递到绑定到该端口的所有套接字。

    (Source)

    【讨论】:

    • 需要澄清。侦听端口不会进入 TIME_WAIT,但接受的连接可能会。 TIME_WAIT 不是为了确保传输所有数据,而是为了避免与相同端点之间的后续连接混淆。
    • “绑定”发生在发送方还是接收方(对于 UDP:SO_REUSEADDR)?如果发送者和接收者是网络上的不同节点会发生什么?
    【解决方案2】:

    另一个主要用途是允许多个套接字将bind() 连接到UDP 上的同一端口。您可能不会认为会出现这种情况,但有时多个应用程序可能希望使用给定端口号侦听广播/多播地址。它还允许绑定到通配符地址,同时也绑定到特定地址。例如,Apache 可能绑定到 *:80 和 10.11.12.13:80

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2011-03-14
      • 1970-01-01
      • 2010-10-21
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多