2014-04-19 65 views
0

當我的Windows服務代碼在公共服務器上的多個IP地址上工作時,如何檢測哪個IP地址正在接收傳入數據包?檢測哪個IP地址正在接收套接字流量

我正在使用UdpSocket來監聽傳入的數據包。

這是我的服務器應用程序的代碼:

ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Any, 5000); 
ServerSocket.Bind(ServerEndPoint); 
ServerSocket.BeginReceiveFrom(_arrReceivedDataBuffer, 0, BUFSIZE - 1, SocketFlags.None, ref ServerEndPoint, DoReceiveFromClient, ServerSocket); 

private void DoReceiveFromClient(IAsyncResult AsyncResult) 
{ 
      _ClientSocket = (Socket)AsyncResult.AsyncState; 
      EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Any, 0); 

      int intMsgLen = _ClientSocket.EndReceiveFrom(AsyncResult, ref ClientEndPoint); 

      String strMessage = "Hello From Server!" 
      byte[] arrData = Encoding.ASCII.GetBytes(strMessage); 
      ServerSocket.SendTo(arrData, arrData.Length, SocketFlags.None, _ClientSocket); 
} 

回答

0

如果您在INADDR_ANY具有在同一子網多個IP地址的系統上聽,那麼有沒有可靠的方法來判斷哪些物理接口實際接收數據包。

當您將回複數據包發送回原始發件人時,您也無法輕鬆控制將使用哪個接口。操作系統可以選擇它認爲該路由的默認源地址。如果這與原始發件人的目標地址不同,則NAT或防火牆設備可能會阻止您的回覆。如果兩個不同的物理接口並行使用作爲窮人的綁定鏈接,也會出現問題。在這種情況下,所有回覆可能只通過其中一個接口進行路由,而另一個則未充分利用。

解決方法是枚舉所有接口,將套接字分別綁定到每個接口,然後標記傳入的數據包,以便知道要回復的套接字。存在的挑戰是,接口可能隨時發生變化,這很難檢測到。

相關問題