【发布时间】:2010-10-09 08:07:01
【问题描述】:
我使用SO_REUSEADDR 让我的服务器终止并重新启动,而不会抱怨套接字已在使用中。我想知道SO_REUSEADDR 是否还有其他用途?有没有人将套接字选项用于上述目的以外的用途?
【问题讨论】:
我使用SO_REUSEADDR 让我的服务器终止并重新启动,而不会抱怨套接字已在使用中。我想知道SO_REUSEADDR 是否还有其他用途?有没有人将套接字选项用于上述目的以外的用途?
【问题讨论】:
对于 TCP,主要目的是在同一地址重新启动已关闭/终止的进程。
需要该标志,因为端口进入TIME_WAIT 状态以确保传输所有数据。
如果两个套接字绑定到相同的接口和端口,并且它们是同一个多播组的成员,则数据将被传递到两个套接字。
我想另一种用途是尝试拦截数据的安全攻击。
(Source)
对于 UDP,SO_REUSEADDR 用于多播。
如果
bind()前面有以下前缀,则可以有多个进程绑定到同一个SOCK_DGRAMUDP 端口:int one = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));在这种情况下,每个传入的多播或广播 UDP 数据报都将发送到 共享端口被传递到绑定到该端口的所有套接字。
(Source)
【讨论】:
另一个主要用途是允许多个套接字将bind() 连接到UDP 上的同一端口。您可能不会认为会出现这种情况,但有时多个应用程序可能希望使用给定端口号侦听广播/多播地址。它还允许绑定到通配符地址,同时也绑定到特定地址。例如,Apache 可能绑定到 *:80 和 10.11.12.13:80
【讨论】: