Question

Ok, je suis encore nouveau à l'utilisation des sockets C, mais je me demandais s'il y a un moyen d'extraire l'adresse IP en cours d'exécution en ajoutant setsockopt? Si vous regardez mon code ci-dessous, j'ai tout dans mes prises multicast prêt à envoyer, sauf pour définir la mc_addr variable qui est mon adresse IP.

Ai-je fait quelque chose de mal qui est réel perceptible? Si oui, ne hésitez pas à me faire connaître ou offrir vos suggestions. En ce moment, cependant, je suis surtout préoccupé par obtenir la mc_addr variables rempli.

Je ne l'ai jamais programmé en C avant (juste python, C ++, et depuis le début de cet été, Objective-C), donc c'est la raison pour laquelle je ne sais pas tout ce qu'il ya à savoir sur le langage C et je suis demander de l'aide.

fichier.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;
Était-ce utile?

La solution

semble correct pour moi - où vous avez la « définir l'adresse IP, nous utiliserons », vous devez simplement mettre mc_addr_str (mc_addr lui-même est rempli avec le code que vous avez déjà, sur la base mc_addr_str). Quelque chose comme:

mc_addr_str = "239.20.30.40";

Il est vraiment à vous ce que vous adresse multicast choix - celui que j'ai mis là je juste pris hors de portée « Administrativement scope ». Vos clients et serveurs ont tout simplement se mettre d'accord là-dessus à l'avance (ou négocier d'une autre manière, comme les clients unicast contacter le serveur pour demander à ce que l'adresse de multidiffusion, ils doivent souscrire à est).

Ce site peut aider.

Autres conseils

Voici un exemple client Multicast en C et, un autre ici .
La ligne correspondante du premier exemple est

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

Je ne sais pas comment vous auriez pu être à la programmation C++ sans comprendre C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top