|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
[C++] socket, select() e broadcast UDP
Ho un problema:
In un'applicazione server che ascolta dei broadcast su una porta UDP, spediti da un mio client, la funzioen select() non si "accorge" quando arrivano. Il pacchetto effettivamente arriva, e l'ho determinato sia usando Wireshark su una macchina nella rete, sia leggendo direttamente senza fare la select: i dati arrivano e ci son tutti. Inoltre, il client ascolta sempre dallo stesso socket le eventuali risposte dei server usando sempre la funzione select(), e quando invio il broadcast, gli ritorna indietro lo stesso e la select in questo caso funziona correttamente!! Il server è un cellulare con windows mobile (Windows CE 5.0) collegato alla rete col wireless, ma non mi risulta che ci siano differenze di funzionamento dei sockets di rete, e in ogni caso il pacchetto arriva, come già spiegato. ecco il codice del server: Codice:
announcer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(VC_ANNOUNCE_PORT);
sin.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int err=bind(announcer, (sockaddr*)&sin, sizeof sin);
BOOL broadcast=TRUE;
err=setsockopt(announcer, SOL_SOCKET, SO_BROADCAST, (char*)&broadcast, sizeof broadcast);
fd_set rs;
timeval t;
t.tv_sec=1;
t.tv_usec=0;
while (!vcclosing)
{
FD_ZERO(&rs);
FD_SET(announcer,&rs);
int n = select(NULL, &rs, NULL, NULL, &t);
if (n)
{ // N è sempre zero e scade sempre il timeout!!
...
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non ho idea, ma ti consiglio di controllare per scrupolo una cosa con cui mi sono già scornato: controlla che il tuo socket announcer abbia un valore _inferiore_ a FD_SETSIZE. Avendo portato alcuni programmi sotto windows, ho avuto la spiacevole sorpresa di constatare come spesso e volentieri i socket ottengono un valore superiore, già all'avvio del programma.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
Quote:
mi pare che nel client con xp l'id del socket sia sull'ordine del migliaio, mentre su WinCE sia minore di 10. quando riaccendo il pc controllo, ora sto scrivendo proprio dal cellulare. se fosse superiore, cosa dovrei fare? comunque, non trovi nulla di sbagliato nel codice che ho postato, per ricevere dei broadcast? se hai soluzioni alternative sono ben accette! ovviamente che non facciano uso di polling sfrenato, che altrimenti il povero processorino TI 200mhz non regge grazie e saluti |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
up!!!
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
-- doppio
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì
Quote:
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
Dall'msdn, http://msdn2.microsoft.com/en-us/library/ms740141.aspx
Codice:
nfds [in] Ignored. The nfds parameter is included only for compatibility with Berkeley sockets. In pratica quando il cell è connesso tramite Activesync al computer, lui vede un'altra interfaccia di rete con IP 192.168.2.1, che è quella che usa activesync per scambiare i dati. La bind fatta in quel modo evidentemente bindava a quell'interfaccia, ho provato a inviare un broadcast DAL cellulare e nel campo sorgente c'era l'ip sbagliato... fatto stà che uando scollego il cellulare allora comincia a funzionare. Ora vorrei sapere qual'è un metodo sicuro per avere gli IP delle interfacce d rete installate sul cellulare, dato che di metodi ne ho visti 100 tutti basati sul dns, etc.... che non mi pare il massimo... ciao e grazie 2000... |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
Quote:
Anche se penso che il metodo sia uguale sia per windows, che per linux, dato che si useranno sempre le socket, o sbaglio? grazie cmq ciao |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
L'aggancio a uno stream broadcast dovrebbe essere uguale; l'individuazione dell'ip di una interfaccia come avevi richiesto è ovviamente differente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
C'è una cosa che mi suona strana, ora che vedo...non dovresti effettuare nel client una IP_ADD_MEMBERSHIP?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2007
Città: E Bosc / gambettola FC
Messaggi: 938
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:48.




















