在设置为IPAddress.any的接收端口上获取UDP发送方IP地址?

时间:2019-03-05 21:09:19

标签: c# udp

我有一个需要从任何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地址。我已经搜索并尝试了所有各种选项,但没有成功。谁能提供一些指导?

1 个答案:

答案 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);

完成上述操作非常完美!

感谢大家的评论!