WinSock 允許同一 IP:Port 被多個 Socket 綁定,封包分派規則為「最明確匹配優先」。此特性稱作 **SO_REUSEADDR**,常用於:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.Bind(new IPEndPoint(IPAddress.Any, 20000));
SocketOptionLevel.Socket:層級為 Socket 層。SocketOptionName.ReuseAddress:對應 SO_REUSEADDR。true/1 啟用,false/0 停用。
// Socket 1:正常綁定
var s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s1.Bind(new IPEndPoint(IPAddress.Any, 20000));
s1.Listen(10);
// Socket 2:啟用重用後綁定同一連接埠
var s2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
s2.Bind(new IPEndPoint(IPAddress.Any, 20000));
s2.Listen(10);
// 此時兩個 Socket 均在聽 20000,WinSock 依目的 IP 具體程度分派連線
| 平台 | SO_REUSEADDR 行為 |
|---|---|
| Windows | 允許多 Socket 綁定同一 IP:Port,甚至不同使用者 |
| Linux (BSD) | 僅允許處於 TIME_WAIT 狀態的連接埠重用,或同一使用者下的多 Socket (需 SO_REUSEPORT) |