2012-09-20 42 views
6

Devo ricevere una trasmissione UDP (in Ubuntu se questo fa alcuna differenza). Usando Wireshark, posso vedere il pacchetto che viene inviato dalla macchina server, e posso vederlo essere ricevuto dalla mia macchina client, ma il mio programma è completamente ignaro. Questo è quello che ho:Ricezione trasmissione 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); 
} 

E 'compilato in modalità debug, il asserisce non sono di cancellarle durante la compilazione, e il mio programma a pochi isolati su recvfrom.

C'è qualche altro cerchio da attraversare per ricevere una trasmissione UDP non mirata?

Modifica: solo un po 'più di informazioni, ho i due computer collegati su un interruttore dedicato, senza interferenze esterne. Ho anche una seconda scheda di rete sul mio computer client che si collega alla rete aziendale, che funziona anche.

Posso eseguire il ping sia all'esterno (Internet funzionante) che la mia macchina server (in più posso vedere i pacchetti effettivi in ​​Wireshark), ma non si sa mai cosa potrebbe causare questo problema.

+0

Questo codice funziona per me (dopo una leggera modifica per renderlo compilato con una compilazione C). Possibile il 'bind' è vincolante per l'interfaccia sbagliata? Cosa significa 'netstat -an | grep 6000' restituisce sul computer client? –

+0

Sì, dovrebbe funzionare, ma non fa per me. 'netstat -an' non mostra nessuna porta aperta di 6000, ho già controllato due volte (ho anche provato ad usare il flag udp di" riutilizzo "). – Blindy

+0

'bind()' in realtà non apre una porta. Solo 'connect()' e 'listen()' lo fanno. Ma non è necessario aprire una porta tramite 'listen()' per ricevere trasmissioni UDP. –

risposta

2

Come risulta il mio codice è perfettamente a posto, come pensavo sarebbe. Si è verificato un problema con la configurazione di rete stessa.

Per i posteri, avevo installato due computer IP'd statici sul proprio hub, invece di utilizzare il server DHCP incorporato sul computer server per allocare l'indirizzo IP dell'altro computer. Abbastanza localizzato per il mio problema, ma non si sa mai ..

1

per inviare e ricevere trasmissioni

  1. essere sicuri che la maschera di rete sia corretta. in Windows Mask per i pacchetti broadcast non ha importanza, ma non in Linux.

  2. presa binding a INADDR_ANY

  3. setsockopt per trasmettere

  4. chiamata sendto con sendaddr.sin_addr.s_addr = inet_addr ("your_interface_broadcast_address"). oppure - chiamare sento più volte per ogni interfaccia con il suo indirizzo IP broadcast.

  5. chiamata recvfrom. in qualsiasi momento prima di chiamare recvfrom, impostare il parametro length.

+7

Perché postare questo? Puoi vedere che ho fatto esattamente questo nel mio messaggio originale del 2012 ... – Blindy

Problemi correlati