Frage

Ok, ich bin immer noch neue C-Sockets verwenden, aber ich frage mich, ob es einen Weg gibt die IP-Adresse Hinzufügen läuft setsockopt zu extrahieren? Wenn Sie unten auf meinem Code aussehen werden, habe ich alles in meinen Multicast-Buchsen bereit, außer zu senden, um die Variable mc_addr für die Definition, die meine IP-Adresse ist.

Mache ich etwas falsch, dass ist wirklich bemerkbar? Wenn ja, fühlen Sie sich frei, mich zu informieren oder Ihre Anregungen bieten. Gerade jetzt aber, ich bin vor allem besorgt über die Variable mc_addr immer ausgefüllt.

Ich habe noch nie in C programmiert vor (nur Python, C ++, und seit Anfang dieses Sommers, Objective-C), so ist dies, warum, weiß ich nicht alles, was es über die C-Sprache kennen zu lernen und bin suche nach Hilfe.

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;
War es hilfreich?

Lösung

Sieht richtig zu mir - wo Sie die „definieren die IP-Adresse werden wir verwenden“ haben gerade eingestellt mc_addr_str Sie sollten (mc_addr selbst wird mit dem Code ausgefüllt Sie bereits dort haben, basierend auf mc_addr_str). So etwas wie:

mc_addr_str = "239.20.30.40";

Es ist wirklich an Ihnen, was Sie Multicast-Adresse wählen - die, die ich dort gesetzt habe ich nahm gerade aus dem „Administrativ scoped“ -Bereich. Ihre Kunden und Server einfach darauf einigen müssen vorher (oder ihm eine andere Art und Weise zu verhandeln, wie die Clients den Server Unicast-Verbindung, um zu fragen, was die Multicast-Adresse sie ist subscribe soll).

Diese Seite helfen können.

Andere Tipps

Hier ist ein Multicast-Client Beispiel in C und ein anderer hier .
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 werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top