sockets - 每个人都必须同意 SO_REUSEADDR 吗?

标签 sockets tcp

我在 SO_REUSEADDR 上看到的所有讨论假设它是在已知端口上创建并绑定(bind)到 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套接字?

谢谢。

最佳答案

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

关于sockets - 每个人都必须同意 SO_REUSEADDR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506971/

相关文章:

java - "Software caused connection abort: recv failed"的原因

c++ - 使用 select 的 tcp 和 udp echoclient 服务器

c# - 异步/等待和任务

python - 这是 python 客户端的有效 TCP/IP 套接字循环吗?

python - 如何在进行 DOS 攻击时在 Python 中显示来自服务器的 TCP 响应数据包

perl - Perl 中的非阻塞 I/O 操作是否仅限于一个线程?好的设计?

c# - Socket ReceiveAsync 合并数据包

networking - 将某个端口上的所有请求转发到网络上另一台机器的最佳方法是什么?

php - TCP CLOSE_WAIT 连接状态 - 未知原因

networking - 这个 wireshark 信息指的是什么