当我的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);
}
答案 0 :(得分:0)
如果您在同一子网上具有多个IP地址的系统上侦听INADDR_ANY
,则无法确定哪个物理接口实际接收到该数据包。
当您将回复数据包发送回原始发件人时,您也无法轻松控制将使用哪个界面。操作系统可以选择它认为该路由的默认源地址。如果这与原始发件人的目标地址不同,则NAT或防火墙设备可能会阻止您的回复。如果将两个不同的物理接口并行用作穷人的绑定链路,也会出现问题。在这种情况下,所有回复只能在其中一个接口上路由,而另一个接口则未得到充分利用。
解决这个问题的方法是枚举所有接口,单独将套接字绑定到每个接口,然后标记传入的数据包,以便知道要回复的套接字。接下来的挑战是接口可能随时发生变化,这很难被发现。