2009-04-14 12 views
8

en C# que estoy usando la función UdpClient.Receive:UdpClient recibir en dirección de difusión

public void StartUdpListener(Object state) 
    { 
     try 
     { 
      udpServer = new UdpClient(new IPEndPoint(IPAddress.Broadcast, 1234)); 
     } 
     catch (SocketException ex) 
     { 
      MessageBox.Show(ex.ErrorCode.ToString()); 
     } 

     IPEndPoint remoteEndPoint = null; 
     receivedNotification=udpServer.Receive(ref remoteEndPoint); 
     ... 

Sin embargo, yo estoy haciendo una excepción de socket diciendo que la dirección no está disponible con el código de error 10049 ¿Qué tengo que hacer para negar esta excepción?

Respuesta

16

Aquí está la información de algún código que estoy usando actualmente en una aplicación de producción que funciona (tenemos un poco más allí para manejar el caso donde el cliente está ejecutando aplicaciones de servidor en una instalación independiente). Su trabajo es recibir notificaciones udp de que los mensajes están listos para su procesamiento. Como lo mencionó Adam Alexander, su único problema es que debe usar IPAddress.Any, en lugar de IPAddress.Broadcast. Solo usaría IPAddress.Broadcast cuando quisiera Enviar un paquete UDP de difusión.

configurar el cliente UDP

this.broadcastAddress = new IPEndPoint(IPAddress.Any, 1234); 
this.udpClient = new UdpClient(); 
this.udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
this.udpClient.ExclusiveAddressUse = false; // only if you want to send/receive on same machine. 

Y para desencadenar el inicio de una asíncrono recibidos mediante una devolución de llamada.

this.udpClient.Client.Bind(this.broadcastAddress); 
this.udpClient.BeginReceive(new AsyncCallback(this.ReceiveCallback), null); 

Esperemos que esto ayuda, usted debe ser capaz de adaptarlo a trabajar de forma sincrónica sin demasiado problema. Muy similar a lo que estás haciendo. Si sigues recibiendo el error después de esto, entonces algo más debe estar usando el puerto que estás tratando de escuchar.

Entonces, para aclarar.

IPAddress.Any = Se utiliza para recibir. Quiero escuchar un paquete que llegue a cualquier dirección IP. IPAddress.Broadcast = Se utiliza para enviar. Quiero enviar un paquete a cualquiera que esté escuchando.

+0

hola, en mi caso me sale un error al transmitir en la misma máquina. has tenido este error, ho cani resuelve este problema – Smith

4

para sus propósitos Creo que querrá usar IPAddress.Any en lugar de IPAddress.Broadcast. ¡Espero que esto ayude!

0

Ese error significa que el protocolo no se puede vincular a la combinación de IP/puerto seleccionada.

No he usado transmisión UDP en años, pero recuerdo que necesita usar diferentes rangos de IP.

0

No hay nada de malo en la forma en que ha configurado su UdpClient. ¿Has probado un número de puerto diferente? Quizás 1234 ya está siendo utilizado en su sistema por una aplicación diferente.

Cuestiones relacionadas