3 votes

Obtenir l'adresse IP du client à partir d'une connexion UDP C#

Actuellement, j'ai une application serveur qui écoute sur un port pour les paquets UDP. Lorsqu'un paquet est envoyé au serveur, il le reçoit correctement et le traite. Y a-t-il un moyen d'obtenir l'adresse IP d'où le paquet provient?

Voici comment je crée le socket

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(OnReceive);
if (!this.UDPListener.ReceiveAsync(socketEventArgs))
    ThreadPool.QueueUserWorkItem(new WaitCallback((Object o) => this.OnReceive(this, socketEventArgs)));

Lorsque OnReceive est appelé, il n'y a rien qui contienne l'adresse IP d'où provient le message. J'ai regardé à travers les SocketAsyncEventArgs et tout ce que je vois est l'adresse IP d'écoute.

Éditer :

Voici ce que j'ai finalement fait.

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

Ensuite, dans le OnReceive voici comment obtenir les données et les informations

//Obtenir le message reçu.
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);

//Commencer à écouter un nouveau 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);

//Gérer le message reçu
Debug.WriteLine("Reçu {0} octets de {1}:{2} à {3}:{4}", udpMessageLength, ((IPEndPoint)clientEndPoint).Address, ((IPEndPoint)clientEndPoint).Port, ((IPEndPoint)receiveSocket.LocalEndPoint).Address, ((IPEndPoint)receiveSocket.LocalEndPoint).Port);

6voto

Allon Guralnek Points 8545

Je ne sais pas pour UdpClient, mais si vous utilisez la classe Socket directement, vous pouvez appeler la méthode .ReceiveFrom(byte[], ref EndPoint) et recevoir l'adresse distante via le deuxième argument.

0voto

Greg Buehler Points 2639

Vous devez inspecter le champ ReceiveMessageFromPacketInfo dans les arguments.

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

0voto

David McEwing Points 3022

Selon http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.remoteendpoint.aspx, le SocketAsyncEventArgs contient une propriété RemoteEndPoint qui contient l'extrémité distante. Y a-t-il quelque chose là-dedans ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X