2011-01-20 14 views
3

現在、UDPパケットをポートでリッスンしているサーバーアプリケーションがあります。サーバーに送信されると、サーバーはそれを適切に受信して処理します。パケットがどこから来たのIPアドレスを得ることができる方法はありますか?ここでUDP接続からクライアントIPを取得するC#

は、私はソケットOnReceiveは、メッセージがどこから来た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))); 

を作成する方法です。私はSocketAsyncEventArgsを見渡していました。私が見ているのはリッスンIPです。

編集:

これは私がやったことです。 OnReceiveで次に

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

HERESにどのようにあなたは、引数に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 –

答えて

6

私はUdpClientについては分かりませんが、Socketクラスを直接使用する場合は、.ReceiveFrom(byte[], ref EndPoint)メソッドを呼び出して、2番目の引数でリモートアドレスを受け取ることができます。

0

を取得します。

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

info.Addressは何らかの理由で私のためにnullです – thecaptain0220

+0

strange; 'e.ReceiveMessageFromPacketInfo'を'(IPEndPoint)e.RemoteEndPoint'に置き換えると 'Address'は何ですか? –

+0

e.RemoteEndPointもnullです。私はあなたがちょうどUDPや何でそれをすることができなかったかどうかは分かりませんでした。その情報はどこかにあるはずです。 – thecaptain0220

関連する問題