【问题标题】:Does everybody have to agree on SO_REUSEADDR?每个人都必须同意 SO_REUSEADDR 吗?
【发布时间】:2012-01-20 08:59:20
【问题描述】:

我在SO_REUSEADDR 上看到的所有讨论都假定它是同一个程序在已知端口上创建并绑定到 TCP 套接字。

我有两个不同的程序使用同一个端口,我很好奇这个机制是如何工作的——为了让程序 2 分配一个端口,程序 1 刚刚关闭,它们是否都必须在之后指定 SO_REUSEADDR他们创建了套接字?

或者对其中一个人来说就足够了吗?如果是这样,当它在 TIME_WAIT 状态下徘徊时,是先获取套接字还是试图打开它的那个?

这是 Python 中的一个小例子,希望能更清楚地说明情况;

# one.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050)) # Assuming 5050 is available
sys.exit(1)        # Assuming s enters TIME_WAIT

# two.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050))
s.listen()

将 one.py 和 two.py 视为两个独立的代码库。

one.py 和 two.py 是否都需要设置 SO_REUSEADDR 套接字选项才能让 two.py 容忍来自 one.py 的延迟 TIME_WAIT 套接字?

谢谢。

【问题讨论】:

  • unixguide.net/network/socketfaq/4.5.shtml 我猜你所有的程序都应该使用 SO_REUSEADRR。
  • Uses of SO_REUSEADDR?的可能重复
  • @JeremyD -- 谢谢!我认为这意味着只有第二个程序需要 SO_REUSEADDR?我还不是很清楚。
  • @VladLazarenko -- 我不这么认为。我想我了解 SO_REUSEADDR 的用途,我在问是否需要多方同意才能使其正常工作。

标签: sockets tcp


【解决方案1】:

回答你的问题。我相信在Linux上你必须在想要重用端口的程序中指定SO_REUSEADDRONLY。很简单。然而,在 Microsoft Windows 上,情况就不同了。 Microsoft 有 a page on MSDN 涵盖 SO_REUSEADDR 和相关功能。

【讨论】:

  • 谢谢,MSDN 的提示非常详尽。我现在了解更多SO_REUSEADDR 的背景,即使我没有看到那里提到套接字状态。也许这归结为对不同实现的经验测试。
  • 另外,感谢您提出可移植性问题,我从未提到我需要为 Linux 和 Windows 制定一致的策略。
【解决方案2】:

我认为是的,所有使用相同端口的程序都应该使用SO_REUSEADDR

因为重用端口的超时是内核的事情。

(但我可能错了)。

【讨论】:

  • 谢谢!但我不能完全按照你的逻辑......你能详细说明一下吗?
【解决方案3】:

监听套接字后面的系统调用是bind(),您不能同时绑定到同一地址上的同一端口:操作系统禁止这样做。 SO_REUSEADDR 告诉其他套接字可以在程序退出后进行侦听。但只要它没有退出,它就是这个端口的专有。

【讨论】:

  • 是的,这在您编辑后更有意义:-)。但这不是我要问的——问题是两个程序是否都需要指定 SO_REUSEADDR 以便程序 2 在程序 1 关闭其套接字后能够在同一端口上打开一个套接字。
【解决方案4】:
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0))

您可以通过将 SO_LINGER 套接字选项设置为零来突然终止 TCP 协商流的 TIME_WAIT 状态。

当你允许两种状态时很好,ESTABLISHED 或没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 2016-08-31
    • 2013-06-25
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多