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

本文关键字:流量 套接字 IP 检测 地址 | 更新日期: 2023-09-27 17:59:04

当我的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);
}

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

如果在同一子网上有多个IP地址的系统上侦听INADDR_ANY,则没有可靠的方法来判断实际接收到数据包的物理接口。

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

解决这一问题的方法是枚举所有接口,将套接字单独绑定到每个接口,然后标记传入的数据包,这样您就知道要对哪个套接字进行回复。面临的挑战是,接口可能随时发生变化,这可能很难检测到。