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.
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? –
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
'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. –