Newsgroup: it.comp.os.linux.development
Titolo: Re: BROADCAST

 
forse dipende dalle tue configurazioni di rete..
se dai il comando ifconfig cosa ti esce?
-- 
SF
Games are very educational. Scrabble teaches us vocabulary, Monopoly teaches 
us cash-flow management, and Dungeons & Dragons teaches us to loot dead bodies.

 255.255.255.0
Il tuo indirizzo di broadcast è 192.168.150.255, non 255.255.255.255

 }
 int bc = 1;
 if( setsockopt( sock, SOL_SOCKET, SO_BROADCAST, &bc, sizeof(bc) ) == -1 ) 
 {
     perror("setsockopt");
     return;
 }
 
 
 man setsockopt
 man 7 socket
Max

Sto provando a fare più o meno la stessa cosa...
Ovvero, ho bisogno di *un* "sender" che invia una stringa a broadcast, 
che viene ricevuta *dai* diversi "listener" sulla rete.
Prendendo spunto dal post di Marco, ho scritto il sender come:
int fd1, n, bc=1;
char buffer[26];
 
struct sockaddr_in broadcast;
 
broadcast.sin_family=AF_INET;
broadcast.sin_port=htons(4999);
inet_aton("255.255.255.255", &broadcast.sin_addr);
 
/*creo la socket UDP*/
fd1=socket(PF_INET, SOCK_DGRAM, 0);
if (fd1<0) perror("\n socket error "), exit(EXIT_FAILURE);
setsockopt(fd1, SOL_SOCKET, SO_BROADCAST, &bc, sizeof(bc) );
strcpy(buffer, "ALIVE");
n=sendto(fd1, buffer, strlen(buffer), 0, (struct sockaddr *) &broadcast, 
sizeof(broadcast));
 
if (n<0) perror("\n errore sendto "), exit(EXIT_FAILURE);
return 0;
---
Ma il listener? Come diavolo deve essere ?
Ho pensato a:
char str[MAXLINE], buf[BUFLEN];
int n, fd_broad, flag=1;
 
struct sockaddr_in ascolto;
struct sockaddr_in indirizzo_sender;
 
socklen_t sender_size=sizeof(indirizzo_sender);
 
/*indirizzo e porta di esclusivo ascolto*/
ascolto.sin_family=AF_INET;
ascolto.sin_port=htons(4999);
ascolto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
 
/*creo socket UDP*/
fd_broad=socket(PF_INET, SOCK_DGRAM, 0);
 
setsockopt(fd_broad, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(int));
 
if ( bind(fd_broad, (struct sockaddr *) &ascolto, sizeof(ascolto)) < 0) {
	perror("\n bind error ");
	exit(EXIT_FAILURE);
}
 
/*resta in attesa di ricevere un messaggio in broadcast*/
n=recvfrom(fd_broad, buf, BUFLEN, MSG_PEEK, (struct sockaddr *) 
&indirizzo_server, &server_size);
 
printf("\n task #%d - ricevuto %s da %s \n", getpid(), buf, 
inet_ntoa(indirizzo_server.sin_addr) );
---
... ma non funziona !
Ho messo come indirizzo del listener INADDR_BROADCAST, è giusto ?
Ho inoltre provato a cambiarlo in INADDR_ANY sia nel listener che nel 
sender e funziona (quindi se il sender manda il messaggio a 0.0.0.0 e il 
listener è in ascolto su 0.0.0.0 lo riceve correttamente), ma non è 
quello che voglio...
Come fare? Mi aiutate please?

Ehi...c'è nessuno? Tutti in vacanza anticipata? :)

 Ehi...c'č nessuno? Tutti in vacanza anticipata? :)
sender:   INADDR_BROADCAST
listener: INADDR_ANY
M

 listener: INADDR_ANY
... non funziona, avevo già provato...
Può dipendere dal fatto che sender e listener (per prova) sono sulla 
stessa macchina ?

 stessa macchina ?
Io ho provato il tuo codice (sulla stessa macchina e su macchine differenti)
e non ho riscontrato problemi. Posta il codice completo che stai usando, o
una versione ridotta compilabile che esibisca lo stesso problema.
Max

 una versione ridotta compilabile che esibisca lo stesso problema.
Grazie per la pazienza :)
Codice listener:
int main (int argc, char *argv[]) {
 
	char buf[BUFLEN];
	int n, fd_broad, flag=1;
 
	struct sockaddr_in ascolto;
	struct sockaddr_in indirizzo_sender;
 
	socklen_t sender_size=sizeof(indirizzo_sender);
 
	ascolto.sin_family=AF_INET;
	ascolto.sin_port=htons(4999);
	ascolto.sin_addr.s_addr=htonl(INADDR_ANY);
	fd_broad=socket(PF_INET, SOCK_DGRAM, 0);
	if (fd_broad<0) perror("\n UDP socket error "),
exit(EXIT_FAILURE);
 
	setsockopt(fd_broad, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(int));
 
	if ( bind(fd_broad, (struct sockaddr *) &ascolto, sizeof(ascolto)) < 0) {
		perror("\n bind error ");
		exit(EXIT_FAILURE);
	}
 
	n=recvfrom(fd_broad, buf, BUFLEN, 0, (struct sockaddr *) 
&indirizzo_sender, &sender_size);
 
	printf("\n task #%d - ricevuto %s da %s \n", getpid(), buf, 
inet_ntoa(indirizzo_sender.sin_addr) );
 
 
	return 0;
 
}/*END main*/
---
Codice sender:
int main (int argc, char *argv[]) {
 
	int fd_udp, n, flag=1;
	char buf[BUFLEN];
 
	struct sockaddr_in broadcast;
 
	broadcast.sin_family=AF_INET;
	broadcast.sin_port=htons(4999);
	broadcast.sin_addr.s_addr=htonl(INADDR_BROADCAST);
 
	fd_udp=socket(PF_INET, SOCK_DGRAM, 0);
	if (fd_udp<0) perror("\n UDP socket error "), exit(EXIT_FAILURE);
 
	setsockopt(fd_udp, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag) );
 
	strcpy(buf, "ALIVE");
 
	n=sendto(fd_udp, buf, strlen(buf), 0, (struct sockaddr *) &broadcast, 
sizeof(broadcast));
	if (n<0) perror("\n errore sendto "), exit(EXIT_FAILURE);
 
	return 0;
 
}/*END main*/
---
Quale può essere il problema ? ... :(

 Quale può essere il problema ? ... :(
Accertati ("/sbin/iptables -L") che non ci siano regole che scartino i
pacchetti UDP in broadcast. Poi usa ngrep ("ngrep -d any port 4999") per
vedere che cosa transita.
Max

 vedere che cosa transita.
Risolto!
Era proprio una rule in iptables che droppava tutto il broadcast :)
Grazie per il salvagente... :)
Ma com'č che io poi non c'ho pensato prima... mmm... :)