C# 在设置为IPAddress的接收端口上获取UDP发送方IP地址。有吗?

C# 在设置为IPAddress的接收端口上获取UDP发送方IP地址。有吗?,c#,udp,C#,Udp,我有一个应用程序,我需要从任何IP地址(在特定端口上)接收UDP单播数据包,但我想知道所接收数据包的发送方IP地址。我创建了一个套接字,并通过以下代码将其绑定: Socket SocketLocal; EndPoint epReceive; int UCPort = 1000; byte[] Buffer = new byte[1500]; SocketLocal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, Protoc

我有一个应用程序,我需要从任何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
public void RxCallBack(IAsyncResult aResult)
{
尝试
{
字节[]接收数据=新字节[1500];
receivedData=(字节[])aResult.AsyncState;
//我处理/解释接收到的数据
// ...
//我有一个列表框,我只是想显示
//发件人的IP地址
添加(SocketLocal.LocalEndPoint.ToString());
//这里我只得到0.0.0.0:
//如果将上面的SocketLocal.LocalEndPoint.ToString修改为SocketLocal.RemoteEndPoint.ToString,则会引发异常
缓冲区=新字节[1500];
SocketLocal.BeginReceiveFrom(Buffer,0,Buffer.Length,SocketFlags.None,ref-epReceive,new-AsyncCallback(RxCallBack),Buffer);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}//RxCallBack的结束
这工作得很好,因为我能够接收从任何IP发送到我的计算机的数据。但是,我想知道发件人的IP地址

当我尝试提取发送者的IP地址时,我只得到“0.0.0.0”,这是有意义的,因为我将套接字设置为
IPAddress.any


一定有办法找到发件人的IP地址。我已经搜索并尝试了所有不同的选项,但都没有结果。有人能提供一些指导吗?

在查看了每个人的评论后,我找到了问题的答案。这里提出了一个类似的问题:

回顾这个问题,我使用了其中的一部分,并且能够为我的原始问题创建一个解决方案。生成的代码将附加到我的原始问题(上面列出)和下面的列表中:

作为后续行动。。。C冈萨雷斯的评论引发了我对这一点的不同看法,因此我能够用以下方法解决我的问题。首先,我将“BeginReceiveFrom”方法的最终参数(状态)修改为实际的套接字。这会影响传递给回调函数的“IAsyncResult”项。现在,我的第一部分软件如下所示:

// Just the BeginReceiveFrom was changed
SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, new AsyncCallback(RxCallBack), SocketLocal);
接下来,我将回调修改为以下内容:

public void RxCallBack(IAsyncResult aResult)
{
    try
    {
            // Create Local Buffer
            byte[] receivedData = new byte[1500];

            // Create Socket to get received data
            Socket ReceiveSocket = (Socket)aResult.AsyncState;

            // Create Endpoint
            EndPoint epReceive = new IPEndPoint(IPAddress.Any, 0);

            // Extract Data...
            int UDPRxDataLength = ReceiveSocket.EndReceiveFrom(aResult, ref epReceive);

            // Copy Rx Data to Local Buffer
            Array.Copy(SocketLocal.Buffer, receivedData, UDPRxDataLength);

            //Start listening for a new message.

            // Setup for next Packet to be received
            Buffer = new byte[1500];
            SocketLocal.BeginReceiveFrom(Buffer, 0, Buffer.Length, SocketFlags.None, ref epReceive, (RxCallBack), SocketLocal);

        // I process/intepret the received data
        // ...

        // The Sender's IP Address is located in the epReceive Endpoint
        lstBox.Items.Add( "Sender IP " + ((IPEndPoint)epReceive).Address.ToString() );

    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.ToString());
    }


}  // End of RxCallBack
做上述工作完美


谢谢大家的评论

“当我尝试提取时”?你是怎么做到的?很明显,文档说明了如何提取远程端点地址,它适用于大多数用户。Good day Lex,当套接字未配置为IpAddress.any,而是特定地址时,您引用的文档工作得非常好。这样做,我可以很容易地获得发件人的IP地址。当我将套接字配置为IPAddress.any时,生成的发送方IP返回为0.0.0.0。这就是问题所在。。。我需要一个可以从任何IP地址接收的套接字,但是,当我接收数据时,我想知道是哪个IP发送了数据。在你的问题中,
eReceive
eRemote
应该是两个不同的变量吗?此外,您丢失了代码中错误的部分;如果你不发布完整的问题,没有人能帮你。再见,本,对不起,我只是复制了我的代码的一部分,并错误地编辑了它。我可以添加更多的代码,但我只是检查如果我已将端口与IP地址绑定,是否可以获取发件人的IP地址。任何参数,但给出错误结果的代码在哪里?它必须位于
BeginReceiveFrom
的回调中,因为每个传入的数据包都带有发送方地址;您不可能在绑定后立即知道它。感谢您发布解决问题的代码。但是,您应该从问题中删除代码,并将其发布在本答案中