2008-12-03 11 views

Antwort

4

In der Regel mit der Berkeley-Sockets-API, um sendto() ein oder mehrere Datagramme zu einer bekannten broadcast-class IP-Adresse.

+0

Ich habe die vorgeschlagene Funktion geändert, um den tatsächlichen Code shodane auszugraben. – unwind

12

Unwind hat es richtig, außer dass Sie ‚sendto‘

Hier ist ein Beispiel verwendet werden soll, die Sie bereits haben eine Fassung annimmt. Es wurde aus genommen clamav

static void 
broadcast(const char *mess) 
{ 
    struct sockaddr_in s; 

    if(broadcastSock < 0) 
     return; 

    memset(&s, '\0', sizeof(struct sockaddr_in)); 
    s.sin_family = AF_INET; 
    s.sin_port = (in_port_t)htons(tcpSocket ? tcpSocket : 3310); 
    s.sin_addr.s_addr = htonl(INADDR_BROADCAST); 

    cli_dbgmsg("broadcast %s to %d\n", mess, broadcastSock); 
    if(sendto(broadcastSock, mess, strlen(mess), 0, (struct sockaddr *)&s, sizeof(struct sockaddr_in)) < 0) 
     perror("sendto"); 
} 
+0

Bitte korrigieren Sie den Quelllink als gültig und HTML-Ankerelement. – sgnsajgon

+0

Link ist jetzt tot – rsaxvc

4

I UDP-Multicast-Server vor kurzem für den Test geschrieben. Um Multicast zu abonnieren, würden Sie Ihren Client der Multicast-Gruppe 225.0.0.37 Port 12346 und Port 12345 abonnieren (2 Feeds - ein Feed sendet "Hello, World!", Der andere "Bye, Office!").

Ich habe es verwendet, um meinen Client zu testen, beide Client und Server laufen auf der gleichen Box, so dass es Bits geben könnte, die nicht funktionieren, aber versuchen Sie es zuerst.

#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <time.h> 
#include <string.h> 
#include <stdio.h> 

#include <unistd.h> 


#define BYE_OFFICE 12346 
#define HELLO_PORT 12345 
#define HELLO_GROUP "225.0.0.37" 

int main(int argc, char *argv[]) 
{ 
    struct sockaddr_in addr; 
    struct sockaddr_in addr2; 
    int fd; 
    int fd2; 
    char *message = "Hello, World!"; 
    char *message2 = "Bye, Office!"; 

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    { 
     perror("socket"); 
     exit(1); 
    } 

    if ((fd2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    { 
     perror("socket"); 
     exit(1); 
    } 

    /* set up destination address */ 
    memset(&addr,0,sizeof(addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr(HELLO_GROUP); 
    addr.sin_port=htons(HELLO_PORT); 

    memset(&addr2,0,sizeof(addr2)); 
    addr2.sin_family = AF_INET; 
    addr2.sin_addr.s_addr = inet_addr(HELLO_GROUP); 
    addr2.sin_port=htons(BYE_OFFICE); 

    while (1) 
    { 
     if (sendto(fd, message, strlen(message), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0) 
     { 
      perror("sendto"); 
      exit(1); 
     } 
     sleep(3); 
     if (sendto(fd2, message2, strlen(message2), 0,(struct sockaddr *) &addr2, sizeof(addr2)) < 0) 
     { 
      perror("sendto2"); 
      exit(1); 
     } 
     sleep(3); 
    } 
} 
+8

Was hat das mit der Frage zu tun? Die Frage ist über Broadcast und das ist über Multicast – xaxxon

32

In vielen IP-Stacks, z. B. Linux, funktioniert dieser Code nicht. Ihr Socket muss Broadcast-Berechtigungen haben. Versuchen Sie Folgendes:

bcast_sock = socket(AF_INET, SOCK_DGRAM, 0); 
int broadcastEnable=1; 
int ret=setsockopt(bcast_sock, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); 

/* Add other code, sockaddr, sendto() etc. */ 
+5

ist richtig! Wenn Sie den Socket-Broadcasting-Berechtigungen nicht geben, erhalten Sie Fehlermeldung verweigert. – Heartinpiece

+5

Dieses Verhalten wird von POSIX tatsächlich benötigt, siehe http://pubs.opengroup.org/onlinepubs/009695399/functions/sendto.html 'sendto() wird fehlschlagen, wenn die SO_BROADCAST-Option für den Socket nicht festgelegt ist –