c# - 从 UDP 连接 C# 获取客户端 ip

标签 c# sockets udp

我目前有一个服务器应用程序正在监听 UDP 数据包的端口。当一个发送到服务器时,它会正确接收并处理它。有什么方法可以获取数据包来源的 IP 地址吗?

下面是我创建套接字的方法

this.UDPListener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, Port);
this.UDPListener.Bind(endPoint);

SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs(); 
socketEventArgs.SetBuffer(this.ReceiveBuffer, 0, this.ReceiveBuffer.Length);
socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
if (!this.UDPListener.ReceiveAsync(socketEventArgs))
    ThreadPool.QueueUserWorkItem(new WaitCallback((Object o) => this.OnReceive(this, socketEventArgs)));

当调用 OnReceive 时,没有任何内容包含消息来源的 ip。我查看了 SocketAsyncEventArgs,我看到的只是监听 ip。

编辑:

这是我最后做的。

this.UDPListener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
this.UDPListener.Bind(new IPEndPoint(IPAddress.Any, Port));

EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
this.UDPListener.BeginReceiveFrom(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, ref remoteEndPoint, OnReceive, this.UDPListener);

然后在OnReceive中获取数据和信息

//Get the received message.
Socket receiveSocket = (Socket)AsyncResult.AsyncState;
EndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 0);
int udpMessageLength = receiveSocket.EndReceiveFrom(AsyncResult, ref clientEndPoint);
byte[] udpMessage = new byte[udpMessageLength];
Array.Copy(ReceiveBuffer, udpMessage, udpMessageLength);

//Start listening for a new message.
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, Int32.Parse(((IPEndPoint)receiveSocket.LocalEndPoint).Port.ToString()));
this.UDPListener.BeginReceiveFrom(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, ref remoteEndPoint, OnReceive, this.UDPListener);

//Handle the received message
Debug.WriteLine("Recieved {0} bytes from {1}:{2} to {3}:{4}", udpMessageLength, ((IPEndPoint)clientEndPoint).Address, ((IPEndPoint)clientEndPoint).Port, ((IPEndPoint)receiveSocket.LocalEndPoint).Address, ((IPEndPoint)receiveSocket.LocalEndPoint).Port);

最佳答案

我不知道UdpClient,但是如果你直接使用Socket类,你可以调用.ReceiveFrom(byte[], ref EndPoint ) 方法,并通过第二个参数接收远程地址。

关于c# - 从 UDP 连接 C# 获取客户端 ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752604/

相关文章:

c# - 尝试一次搜索 2 个数组 C# 并打印出任何匹配信息

android - 后台套接字连接

java - 使用 TCP 的心跳原型(prototype)的良好超时 - Java 套接字

c++ - SIP over TCP + 转换为 UDP 以与 SIP 电话通话

c# - 同一台计算机上两个程序之间的通信——如何?

c# - 如何在 UWP 中通过 PathGeometry 进行裁剪?

c# - 在 Windows 8 CP 中设置所选 ListViewItem 的样式

c# - 在 C# 中的 FileSystemWatcher 中读取文本文件时出现文件已被另一个资源使用的错误

c++ - CSocket 在发送时不阻塞

sockets - 两个应用程序可以监听同一个端口吗?