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