我有一个需要从任何IP地址(在特定端口上)接收UDP单播数据包的应用程序,但是我想知道接收到的数据包的发件人的IP地址。我创建了一个套接字,并通过以下代码对其进行了绑定:
Socket SocketLocal;
EndPoint epReceive;
int UCPort = 1000;
byte[] Buffer = new byte[1500];
SocketLocal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
SocketLocal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
// Bind Socket
epReceive = new IPEndPoint(IPAddress.Any, UCPort );
SocketLocal.Bind(epReceive);
SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), Buffer);
回调类似于:
public void RxCallBack(IAsyncResult aResult)
{
try
{
byte[] receivedData = new byte[1500];
receivedData = (byte[])aResult.AsyncState;
// I process/intepret the received data
// ...
// I have a list box where I simply want to display
// the sender's IP address
lstBox.Items.Add(SocketLocal.LocalEndPoint.ToString()));
// Here I simply get 0.0.0.0:<port number>
// If I modify SocketLocal.LocalEndPoint.ToString above to SocketLocal.RemoteEndPoint.ToString it throws an exception
Buffer = new byte[1500];
SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), Buffer);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
} // End of RxCallBack
这很好用,因为我能够接收从任何IP发送到计算机的数据。但是,我想知道发送者的IP地址。
当我尝试提取发件人的IP地址时,我只会得到“ 0.0.0.0”,考虑到我将套接字设置为IPAddress.any
必须有一种方法来查找发件人的IP地址。我已经搜索并尝试了所有各种选项,但没有成功。谁能提供一些指导?
答案 0 :(得分:1)
查看所有人的评论后,我找到了问题的答案。这里有一个类似的问题:
C# UDP Socket: Get receiver address
审阅此问题时,我使用了部分问题,并且能够为原始问题创建解决方案。结果代码被附加到上面和下面列出的我的原始问题中:
作为后续... C冈萨雷斯(C Gonzales)的评论促使我以不同的方式看待这一问题,因此我能够通过以下方式解决我的问题。首先,我将“ BeginReceiveFrom”方法的最终参数(状态)修改为实际的套接字。这会影响传递给回调函数的“ IAsyncResult”项。现在我的第一部分软件是这样的:
istioctl proxy-status
接下来,我将调用修改为以下内容:
// Just the BeginReceiveFrom was changed
SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), SocketLocal);
完成上述操作非常完美!
感谢大家的评论!