首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# Socket 連接埠重用:SetSocketOption(ReuseAddress) 實作與原理

     編輯:關於C#

什麼是連接埠重用

WinSock 允許同一 IP:Port 被多個 Socket 綁定,封包分派規則為「最明確匹配優先」。此特性稱作 **SO_REUSEADDR**,常用於:

  • 伺服器重啟快速重綁 (避免 TIME_WAIT 等待)。
  • 多執行緒/進程共聽同一連接埠 (配合負載均衡)。
  • 多播/廣播多接收器共用連接埠。

啟用方式


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 綁定範例


// 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 具體程度分派連線

跨平台差異提醒

Linux 高併發常搭配 SO_REUSEPORT (Kernel 3.9+) 實現多執行緒共聽。

安全性考量

  • 惡意程式可重用連接埠攔截流量,**生產環境請配合防火牆限制來源 IP**。
  • 容器/雲環境下,連接埠重用可能干擾服務發現與健康檢查,需測試驗證。

小結

一行 SetSocketOption(ReuseAddress, true) 即可啟用連接埠重用,解決伺服器重啟等待、多進程共聽等場景,但需注意跨平台行為差異與安全風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
平台SO_REUSEADDR 行為
Windows允許多 Socket 綁定同一 IP:Port,甚至不同使用者
Linux (BSD)僅允許處於 TIME_WAIT 狀態的連接埠重用,或同一使用者下的多 Socket (需 SO_REUSEPORT)