SO_REUSEADDR的用例是什么?

26

我使用了SO_REUSEADDR来使我的服务器在重启时不会抱怨套接字已经在使用中。我想知道:还有其他用途可以用于SO_REUSEADDR吗?是否有人将该套接字选项用于除此之外的其他目的?

2个回答

44
对于TCP,主要目的是在相同的地址上重新启动已关闭/终止的进程。
需要标志是因为端口进入TIME_WAIT状态以确保所有数据都被传输。
如果两个套接字绑定到同一接口和端口,并且它们是同一组播组的成员,则数据将传递到两个套接字。
我猜另一种用法可能是安全攻击,试图拦截数据。
(来源)
对于UDPSO_REUSEADDR用于多播。

More than one process may bind to the same SOCK_DGRAM UDP port if the bind() is preceded by:

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

In this case, every incoming multicast or broadcast UDP datagram destined to the shared port is delivered to all sockets bound to the port.

(来源)

3
需要澄清。监听端口不会进入TIME_WAIT状态,但接受的连接可能会进入该状态。TIME_WAIT状态的作用不是为了确保所有数据都传输完成,而是为了避免在同一端点之间建立后续连接时出现混淆。 - user207421
“bind” 是在发送方还是接收方发生的(对于 UDP:SO_REUSEADDR)?如果发送方和接收方是网络上的不同节点会发生什么? - Sammy
@Sammy 接收方(服务器)在 UDP IP:port 上执行 SO_REUSEADDR + bind()。发送方(客户端)bind() + sendmsg() 或只需使用 sendto() 发送消息到接收方。为了进行双向通信,两台计算机都创建一个套接字来接收(因此即使是客户端也像服务器一样)。如果您习惯于 TCP,则肯定会感到困惑。如果您有单独的节点(计算机),则 SO_REUSEADDR 无用,因为每台计算机只能有一个侦听器。 - Alexis Wilke

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

它还允许将绑定到通配符地址,同时也绑定到特定地址,这与“man 7 socket”和使用“socat”进行的经验测试相矛盾。 - claymation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接