2015-11-25 2 views
0

Я создаю небольшое приложение-отправитель и получатель, которое передает его имя всем другим приложениям в группе многоадресной передачи, а также получает имена других приложений.Возможно ли получить список всех адресов sockaddr_in для каждого сокета в группе многоадресной передачи

Я думаю, что отправка части делается сейчас, как показано ниже:

if (sendto(sock, message, sizeof(message), 0, (struct sockaddr *) &receiver_addr, sizeof(receiver_addr)) < 0) { 
      perror("sendto"); 
      exit(1); 
     } 

receiver_addr имеет свой IP-адрес, установленный в IP-адрес многоадресной группы, поэтому я уверен, что каждое гнездо в группа получила сообщение. Но теперь я хочу сохранить полученное сообщение из каждого сокета в группе многоадресной передачи в массив. Пример кода, я видел использует следующий код:

if (recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *) &sender_addr, &senderlen) < 0) 
     { 
      perror("recvfrom"); 
      exit(1); 
     } 

На этот раз sender_addr переменная является адрес порта, из которого данные пришли. Но это только получает информацию, отправленную единственным хостом с адресом sender_addr. Я хочу получить список всех адресов портов внутри группы многоадресной рассылки, чтобы я мог запустить цикл метода recvfrom, но изменил значение receiver_addr на адрес каждого из сокетов в группе.

ответ

2

Можно ли получить список всех sockaddr_in адресов для каждого сокета в группе многоадресной рассылки

Нет, это даже не представляется возможным, чтобы получить список членов группы многоадресной рассылки, не говоря уже о каком-либо их атрибуте.

У получателя_аддер свой IP-адрес установлен на ip-адрес группы многоадресной передачи, поэтому я уверен, что каждый сокет в группе получил сообщение.

Нет, вы не являетесь. Многоадресная рассылка выполняется через UDP, а UDP - ненадежный протокол. Вы не можете быть уверены в таких вещах.

Я хочу, чтобы получить список всех адресов портов внутри группы многоадресной рассылки

невезения. Вы не можете.

, так что я могу запустить цикл метода recvfrom, но изменить значение receiver_addr на адрес каждого из сокетов в группе.

У вас есть основное недоразумение аргумента address от recvfrom(). Это не фильтр, который вы задали заранее. Это параметр , рассказывающий вам, откуда была получена датаграмма.

+0

Есть ли другой подход, который я могу предпринять для сбора данных из всех сокетов в группе многоадресной рассылки. – user217339

+0

Только получив их, чтобы отправить вам что-нибудь, например. как рукопожатие с подписью. – EJP