2011-01-20 43 views
3

我目前有一個服務器應用程序正在偵聽UDP數據包的端口。當一個發送到服務器時,它會正確接收並處理它。有什麼辦法可以得到數據包的IP地址?從UDP連接獲取客戶端IP C#

這裏是我創建套接字

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

然後繼承人如何獲得你需要檢查的參數的ReceiveMessageFromPacketInfo字段中的數據和信息

//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); 
+0

這裏有個很好的答案http://stackoverflow.com/a/5795658/397817 – 2014-09-06 21:35:41

回答

6

我不知道UdpClient,但如果直接使用Socket類,則可以調用.ReceiveFrom(byte[], ref EndPoint)方法,並通過第二個參數接收遠程地址。

0

void OnReceive(object sender, SocketAsyncEventArgs e) 
    { 
     var info = e.ReceiveMessageFromPacketInfo; 
     byte[] address = info.Address.GetAddressBytes(); 
    } 
+0

info.Address對我來說是空的 – thecaptain0220 2011-01-20 21:24:00

+0

奇怪;如果用'(IPEndPoint)e.RemoteEndPoint`替換`e.ReceiveMessageFromPacketInfo`,'Address'是什麼? – 2011-01-20 21:29:15