2008-12-03 32 views

回答

4

通常使用Berkeley sockets API,將sendto()一個或多個數據報發送到已知的broadcast-class IP地址。

+0

我改變了建議的功能,以匹配shodane挖出的實際代碼。 – unwind 2008-12-03 15:33:46

12

開卷有它的權利,但你應該使用「的sendto」

下面是一個例子,假設你已經有一個插座。它取自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

請更正源代碼鏈接是否有效以及html定位元素。 – sgnsajgon 2013-05-31 15:20:10

+0

鏈接現已停止 – rsaxvc 2013-06-02 00:25:04

4

我最近寫了udp組播服務器進行測試。要訂閱多播,您可以訂閱您的客戶端到組播組225.0.0.37端口12346和端口12345(2個訂閱源 - 一個訂閱源發送「Hello,World!」另一個「再見,辦公室!」)。

我一直在使用它來測試我的客戶端,客戶端和服務器都運行在同一個盒子上,所以可能有些位可能無法正常工作,但先試一試。

#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

這與問題有什麼關係?問題是關於廣播,這是關於多播 – xaxxon 2013-09-02 07:10:21

32

在許多IP堆棧中,如Linux,此代碼不起作用。您的套接字必須具有廣播權限。試試這個:

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. */