2009-07-11 9 views
0

Ok, ich bin noch neu in der Verwendung von C-Sockets, aber ich frage mich, ob es eine Möglichkeit gibt, die IP-Adresse hinzufügen laufende setsockopt hinzufügen? Wenn Sie sich meinen Code unten ansehen, habe ich alles in meinen Multicast-Sockets bereit zum Senden außer der Definition der Variable mc_addr, die meine IP-Adresse ist. Mache ich etwas falsch, das ist wirklich spürbar? Wenn ja, zögern Sie nicht, lassen Sie mich wissen oder bieten Sie Ihre Vorschläge. Im Moment bin ich hauptsächlich besorgt darum, die Variable mc_addr auszufüllen. Ich habe noch nie in C programmiert (nur Python, C++ und seit Beginn dieses Sommers objectove-C), deshalb weiß ich ALLES NICHT, was es über die C-Sprache zu wissen gibt, und suche Hilfe.Extrahieren von IP-Adresse aus C-Sockets

file.h

#define MYPORT 5673   /* port for our multicast socket */ 

int sock;     /* socket descriptor */ 
char send_str[MAX_LEN];  /* string to send */ 
struct sockaddr_in mc_addr; /* socket address structure */ 
unsigned int send_len;  /* length of string to send */ 
char* mc_addr_str;   /* multicast IP address */ 
unsigned short mc_port;  /* multicast port */ 
unsigned char mc_ttl;  /* time to live (hop count) */ 

file.c

mc_port = MYPORT; 
/* create a socket for sending to the multicast address */ 
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 
    NSLog(@"ERROR: broadcastMessage - socket() failed"); 
    return 1; 
} 

/* set the TTL (time to live/hop count) for the send */ 
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, 
     (void*) &mc_ttl, sizeof(mc_ttl))) < 0) { 
    NSLog(@"ERROR: broadcastMessage - setsockopt() failed"); 
    return 1; 
} 

// define the IP address we will be using 
mc_addr = // ??? 

/* construct a multicast address structure */ 
memset(&mc_addr, 0, sizeof(mc_addr)); 
mc_addr.sin_family  = AF_INET; 
mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str); 
mc_addr.sin_port  = htons(mc_port); 

/* clear send buffer */ 
memset(send_str, 0, sizeof(send_str)); 

while (fgets(send_str, MAX_LEN, stdin)) { 
    send_len = strlen(send_str); 

    /* send string to multicast address */ 
    if ((sendto(sock, send_str, send_len, 0, 
      (struct sockaddr *) &mc_addr, sizeof(mc_addr))) != send_len) { 
     NSLog(@"ERROR: broadcastMessage - sendto() sent incorrect number of bytes"); 
     return 1; 
    } 

    /* clear send buffer */ 
    memset(send_str, 0, sizeof(send_str)); 
} 

close(sock); 
return 0; 
+0

Siehe http://stackoverflow.com/questions/236231/how-do-i-choose-a-multicast-address-for-my-applications-use – mark4o

Antwort

2

Sieht für mich richtig aus - wo Sie die "definieren Sie die IP-Adresse, die wir verwenden werden" müssen Sie nur mc_addr_str (mc_addr selbst ist mit dem Code, den Sie bereits dort, basierend auf mc_addr_str) ausgefüllt haben. Etwas wie:

mc_addr_str = "239.20.30.40"; 

Es ist wirklich an Ihnen, was Sie wählen, Multicast-Adresse - die, die ich dort gesetzt habe ich nahm gerade aus dem Bereich „Administrativ scoped“. Ihre Clients und Server müssen sich vorher darauf einigen (oder auf andere Weise aushandeln, so wie die Clients den Unicast des Servers kontaktieren, um nach der Multicast-Adresse zu fragen, die sie abonnieren sollten).

This site kann helfen.

+0

Was ist, wenn ich das gerade getan habe? Ich bin mir ziemlich sicher, dass es funktionieren würde, aber ich möchte nur bestätigen. mc_addr = IN_ADDR_ANY; –

+0

Nein, Sie müssen es auf eine Multicast-Zieladresse einstellen, und IN_ADDR_ANY ist kein Multicast-Ziel. (mc_addr ist die Zieladresse - die Quelladresse würde durch bind() gesetzt werden, aber Sie rufen nicht bind() auf, so dass es nur die am besten geeignete lokale Adresse verwendet, was in Ordnung ist). – caf

1

Hier ist ein Multicast client example in C und andere here.
Die entsprechende Zeile aus dem ersten Beispiel ist

saddr.sin_addr.s_addr = inet_addr("226.0.0.1"); //your mcast IP address 

Ich bin nicht sicher, wie Sie ohne zu verstehen, C in C++ Programmierung worden sein könnten.

+0

Damals programmierte ich sowohl C++ als auch C ohne Verständnis C. Offensichtlich wurde mein Code viel besser, sobald ich anfangen zu verstehen ;-) –