检测哪个IP地址正在接收套接字流量

时间:2014-04-19 12:32:02

标签: c# udp udpclient

当我的Windows服务代码在公共服务器上的多个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);
}

1 个答案:

答案 0 :(得分:0)

如果您在同一子网上具有多个IP地址的系统上侦听INADDR_ANY,则无法确定哪个物理接口实际接收到该数据包。

当您将回复数据包发送回原始发件人时,您也无法轻松控制将使用哪个界面。操作系统可以选择它认为该路由的默认源地址。如果这与原始发件人的目标地址不同,则NAT或防火墙设备可能会阻止您的回复。如果将两个不同的物理接口并行用作穷人的绑定链路,也会出现问题。在这种情况下,所有回复只能在其中一个接口上路由,而另一个接口则未得到充分利用。

解决这个问题的方法是枚举所有接口,单独将套接字绑定到每个接口,然后标记传入的数据包,以便知道要回复的套接字。接下来的挑战是接口可能随时发生变化,这很难被发现。