Pregunta

Ok, estoy todavía nuevo en el uso de sockets C, pero me preguntaba si hay una manera de extraer la dirección IP de la adición de funcionamiento setsockopt? Si usted se verá en mi código de abajo, tengo todo en mis enchufes de multidifusión listos para enviar a excepción de la definición de la mc_addr variable que es mi dirección IP.

¿Estoy haciendo algo mal eso es muy notorio? Si es así, no dude en hacérmelo saber u ofrecer sus sugerencias. En este momento, sin embargo, estoy principalmente preocupado por conseguir la variable mc_addr llenado.

Nunca he programado en C antes (solo pitón, C ++, y desde el comienzo de este verano, Objective-C), por lo que este es por eso que no sabemos todo lo que hay que saber sobre el lenguaje C y soy en busca de ayuda.

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;
¿Fue útil?

Solución

Parece correcta para mí - donde usted tiene la mc_addr_str "definir la dirección IP que va a utilizar" sólo debe establecer (mc_addr sí se llena con el código que ya tiene allí, basado en mc_addr_str). Algo así como:

mc_addr_str = "239.20.30.40";

Es realmente depende de ti lo que de direcciones de multidifusión que elija - el que yo he puesto allí me acaba de recoger fuera del "punto de vista administrativo de ámbito de" gama. Sus clientes y el servidor sólo tienen que ponerse de acuerdo sobre ello de antemano (o negociar de alguna otra forma, al igual que los clientes en contacto con el servidor de unidifusión a preguntar cuál es la dirección de multidifusión que deben suscribir es).

Este sitio puede ayudar.

Otros consejos

Aquí es un ejemplo del cliente de multidifusión en C y, otro aquí .
La línea correspondiente del primer ejemplo es

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

No estoy seguro de cómo se podría haber estado programando en C++ sin entender C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top