2012-09-20 14 views
6

Tengo que recibir una transmisión UDP (en Ubuntu si eso hace la diferencia). Usando Wireshark, puedo ver el paquete que se envía desde la máquina del servidor, y puedo ver que lo recibe mi máquina cliente, pero mi programa es completamente ajeno. Esto es lo que tengo:Recepción de transmisión UDP

sockaddr_in si_me, si_other; 
int s; 
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1); 
int port=6000; 
int broadcast=1; 

setsockopt(s, SOL_SOCKET, SO_BROADCAST, 
      &broadcast, sizeof broadcast); 

memset(&si_me, 0, sizeof(si_me)); 
si_me.sin_family = AF_INET; 
si_me.sin_port = htons(port); 
si_me.sin_addr.s_addr = INADDR_ANY; 

assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1); 

while(1) 
{ 
    char buf[10000]; 
    unsigned slen=sizeof(sockaddr); 
    recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen); 

    printf("recv: %s\n", buf); 
} 

Se compila en modo de depuración, el afirma que no están siendo borrados durante la compilación, y mi programa sólo bloques en recvfrom.

¿Hay algún otro círculo que deba atravesar para recibir una transmisión UDP no focalizada?

Edición: solo un poco más de información, tengo las dos computadoras conectadas en un interruptor dedicado, sin interferencias externas. También tengo una segunda tarjeta de red en mi computadora cliente que se conecta a la red de la compañía, que también funciona.

Puedo hacer ping tanto en el exterior (trabajando en Internet) como en mi máquina servidor (además puedo ver los paquetes reales en Wireshark), pero nunca se sabe qué podría causar este problema.

+0

Este código funciona para mí (después de una pequeña modificación para compilarlo con una compilación C). Posible que el 'bind' se enlace a la interfaz incorrecta? ¿Qué hace 'netstat -an | ¿grep 6000' return en la máquina del cliente? –

+0

Sí, se supone que funciona, pero no funciona para mí. 'netstat -an' no muestra el puerto abierto 6000, ya lo comprobé doblemente (también intenté usar el indicador udp" reuse "). – Blindy

+0

'bind()' en realidad no abre un puerto. Solo 'connect()' y 'listen()' hacen eso. Pero no necesita abrir un puerto a través de 'listen()' para recibir transmisiones UDP. –

Respuesta

2

Como resultado, mi código está perfectamente bien, como pensé que sería. Hubo un problema con la configuración de la red en sí.

Para la posteridad, había configurado dos computadoras con IP estático en su propio concentrador, en lugar de usar el servidor DHCP integrado en la máquina del servidor para asignar la dirección IP a la otra computadora. Bastante localizado para mi problema, pero nunca se sabe ..

1

para enviar y recibir emisión

  1. estar seguros de que la máscara de red es correcta. en la máscara de Windows para paquetes de difusión no importa, pero no en Linux.

  2. socket se unen a INADDR_ANY

  3. setsockopt para transmitir

  4. llamada sendto con sendaddr.sin_addr.s_addr = inet_addr ("your_interface_broadcast_address"). o - llame al sento varias veces para cada interfaz con su dirección IP de difusión.

  5. llamada recvfrom. cualquier momento antes de llamar a recvfrom, configure el parámetro de longitud.

+7

¿Por qué publicar esto? Pueden ver que hice exactamente esto en mi mensaje original de 2012 ... – Blindy

Cuestiones relacionadas