預設情況下,同一 UDP 連接埠僅允許一個 Socket 綁定。多執行緒或多進程場景下(如多播接收),需啟用 SO_REUSEADDR 選項實現連接埠重用。
IPAddress groupAddress = IPAddress.Parse("239.0.84.11");
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 關鍵:啟用連接埠重用
listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
listener.Bind(new IPEndPoint(IPAddress.Any, 8411));
// 加入多播群組
MulticastOption multicastOption = new MulticastOption(groupAddress);
listener.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, multicastOption);
SocketOptionLevel.Socket + SocketOptionName.ReuseAddress:對應 Win32 SO_REUSEADDR,允許多個 Socket 綁定相同 IP:Port。1 表啟用,0 表停用。IPAddress.Any 並透過 AddMembership 加入特定群組,所有 Socket 皆能收到多播封包。SO_REUSEADDR 行為與 Linux 略有不同,建議測試驗證。一行 SetSocketOption 即可解決 UDP 連接埠重用需求,配合多播選項,滿足高併發、分散式接收場景。