C# 在设置为IPAddress的接收端口上获取UDP发送方IP地址。有吗?
我有一个应用程序,我需要从任何IP地址(在特定端口上)接收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
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
的回调中,因为每个传入的数据包都带有发送方地址;您不可能在绑定后立即知道它。感谢您发布解决问题的代码。但是,您应该从问题中删除代码,并将其发布在本答案中