2009-07-11 2 views
0

Хорошо, я все еще новичок в использовании сокетов C, но мне было интересно, есть ли способ извлечь IP-адрес, добавив запущенный setsockopt? Если вы посмотрите на мой код ниже, у меня есть все в моих многоадресных сокетах, готовых к отправке, кроме определения переменной mc_addr, которая является моим IP-адресом. Я делаю что-то неправильно, это реально заметно? Если да, не стесняйтесь, дайте мне знать или предложите свои предложения. Однако сейчас я в основном обеспокоен тем, что переменная mc_addr заполнена. Я никогда не программировал на C раньше (просто python, C++, и с начала этого лета, objectove-C), поэтому я не знаю ВСЕ, что нужно знать о языке C и я ищу помощь.Извлечение IP-адреса из C-сокетов

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

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

ответ

2

Понятно, что у меня есть «определение IP-адреса, который мы будем использовать», вы должны просто установить mc_addr_str (сам mc_addr заполнен кодом, который у вас уже есть, на основе mc_addr_str). Что-то вроде:

mc_addr_str = "239.20.30.40"; 

Это действительно до вас, что адрес многоадресной рассылки вы выбираете - один я поставил там я просто выбрал из «Административно область действия» диапазон. Ваши клиенты и сервер должны просто договориться об этом заранее (или договориться об этом по-другому, например, клиенты свяжутся с сервером одноадресной рассылки, чтобы узнать, каким должен быть адрес для многоадресной рассылки).

This site может помочь.

+0

Что делать, если я просто это сделал? Я уверен, что это сработает, но я просто хочу подтвердить. mc_addr = IN_ADDR_ANY; –

+0

Нет, вам нужно установить его на адрес назначения многоадресной рассылки, а IN_ADDR_ANY не является адресатом многоадресной рассылки. (mc_addr - адрес назначения - адрес источника будет задан bind(), но вы не вызываете bind(), поэтому он будет использовать только наиболее подходящий локальный адрес, что хорошо). – caf

1

Вот Multicast client example in C и другой here.
Соответствующая строка из первого примера

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

Я не знаю, как вы могли бы программировать в C++ без понимания C.

+0

В тот же день я запрограммировал как C++, так и C без понимание C. Очевидно, мой код стал намного лучше, когда я начал понимать ;-) –

Смежные вопросы