2008-12-03 14 views

उत्तर

4

आमतौर पर बर्कले सॉकेट एपीआई का उपयोग करके sendto() एक ज्ञात broadcast-class आईपी पते पर एक या अधिक डेटाग्राम। को छोड़कर आप का उपयोग करना चाहिए 'sendto'

यहाँ एक उदाहरण, मानता है कि आप पहले से ही एक सॉकेट है

+0

मैंने वास्तविक कोड शोडेन खोदने के लिए सुझाए गए फ़ंक्शन को बदल दिया। – unwind

12

खोलना सही यह है। यह से 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

कृपया वैध और एचटीएमएल एंकर तत्व होने के लिए स्रोत लिंक सही करें। – sgnsajgon

+0

लिंक अब मृत है – rsaxvc

4

मैं परीक्षण के लिए हाल ही में यूडीपी बहुस्त्र्पीय सर्वर लिखा लिया गया था। मल्टीकास्ट की सदस्यता लेने के लिए आप अपने क्लाइंट को मल्टीकास्ट समूह 225.0.0.37 पोर्ट 12346 और पोर्ट 12345 (2 फ़ीड्स - एक फ़ीड्स "हैलो, वर्ल्ड!" भेजता है, दूसरा "अलविदा, कार्यालय!")।

मैं अपने क्लाइंट का परीक्षण करने के लिए इसका उपयोग कर रहा हूं, क्लाइंट और सर्वर दोनों एक ही बॉक्स पर चलते हैं, इसलिए ऐसी बिट्स हो सकती हैं जो काम नहीं कर सकती हैं लेकिन इसे पहले कोशिश करें।

#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

32

लिनक्स जैसे कई आईपी स्टैक में, यह कोड काम नहीं करता है। आपकी सॉकेट में प्रसारण अनुमतियां होनी चाहिए। इसे आज़माएं:

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

के बारे में है सही है! यदि आप सॉकेट प्रसारण अनुमतियां नहीं देते हैं, तो आपको त्रुटि संदेशों से इनकार कर दिया जाएगा। – Heartinpiece

+5

यह व्यवहार वास्तव में POSIX द्वारा आवश्यक है, http://pubs.opengroup.org/onlinepubs/009695399/functions/sendto.html 'sendto() विफल हो जाएगा यदि SO_BROADCAST विकल्प सॉकेट के लिए सेट नहीं है ' –

संबंधित मुद्दे