Проблема в прослушивании многоадресной рассылки в C ++ с несколькими сетевыми картами - PullRequest
1 голос
/ 27 февраля 2011

Я пытаюсь написать многоадресный клиент на машине с двумя сетевыми картами, и я не могу заставить ее работать. С помощью сниффера я вижу, что, как только я запускаю программу, NIC (eth4) начинает получать дейтаграммы многоадресной рассылки, однако я не могу получить ни один () в моей программе.

При запуске "tshark -i eth4 -R udp.port == xxx (многоадресный порт)"
Я получаю:
1059.435483 г.г.г.г. (некоторые ip) -> z.z.z.z (многоадресный ip, а не мой IP-адрес eth4) Порт UDP-источника: kkk (другой порт) Порт назначения: xxx (порт многоадресной передачи)

Искал в Интернете некоторые примеры / объяснения, но, похоже, я делаю то, что делают все остальные. Любая помощь будет оценена. (что-нибудь связанное с маршрутом / iptables / code?)

bool connectionManager::sendMulticastJoinRequest()
{
struct sockaddr_in localSock;
struct ip_mreqn group;

char* mc_addr_str = SystemManager::Instance()->getTCP_IP_CHT();
char* local_addr_str = SystemManager::Instance()->getlocal_IP_TOLA();
int port = SystemManager::Instance()->getTCP_Port_CHT();
/* Create a datagram socket on which to receive. */

CHT_UDP_Feed_sock = socket(AF_INET, SOCK_DGRAM, 0);

if(CHT_UDP_Feed_sock < 0)
{
    perror("Opening datagram socket error");
    return false;
}
/* application to receive copies of the multicast datagrams. */
{
  int reuse = 1;
  if(setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
  {
      perror("Setting SO_REUSEADDR error");
      close(CHT_UDP_Feed_sock);
      return false;
  }
}

/* Bind to the proper port number with the IP address */
/* specified as INADDR_ANY. */
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(port);
localSock.sin_addr.s_addr =inet_addr(local_addr_str); // htonl(INADDR_ANY); //
if(bind(CHT_UDP_Feed_sock, (struct sockaddr*)&localSock, sizeof(localSock)))
{
    perror("Binding datagram socket error");
    close(CHT_UDP_Feed_sock);
    return false;
}

/* Join the multicast group mc_addr_str on the local local_addr_str */
/* interface. Note that this IP_ADD_MEMBERSHIP option must be */
/* called for each local interface over which the multicast */
/* datagrams are to be received. */

group.imr_ifindex = if_nametoindex("eth4");
if (setsockopt(CHT_UDP_Feed_sock, SOL_SOCKET, SO_BINDTODEVICE, "eth4", 5) < 0)
    return false;
group.imr_multiaddr.s_addr = inet_addr(mc_addr_str);
group.imr_address.s_addr = htonl(INADDR_ANY); //also tried inet_addr(local_addr_str); instead
if(setsockopt(CHT_UDP_Feed_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
{
    perror("Adding multicast group error");
    close(CHT_UDP_Feed_sock);
    return false;
}

// Read from the socket.
char databuf[1024];
int datalen = sizeof(databuf);
if(read(CHT_UDP_Feed_sock, databuf, datalen) < 0)
{
    perror("Reading datagram message error");
    close(CHT_UDP_Feed_sock);
    return false;
}
else
{
    printf("Reading datagram message...OK.\n");
    printf("The message from multicast server is: \"%s\"\n", databuf);
}
return true;
}   

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Просто мысль, (я не много работал с многоадресной рассылкой), но может ли это быть потому, что вы привязываетесь к определенному IP-адресу?Сокет может принимать только пакеты, предназначенные для его привязанного IP-адреса, и отклонять многоадресные?

0 голосов
/ 27 февраля 2011

Ну, некоторое время назад я не играл с многоадресной рассылкой. Вам не нужны права root / admin для его использования? Вы включили их при запуске вашей программы?

...