2016-06-08 12 views
4

Если я бег:tcpdump ничего не показывает для моего приложения на C++?

iperf -s -u -B 224.0.31.155 

и запустить

sudo tcpdump -ni any 'host 224.0.31.155' 

ТСРйитра способен захватить что-то:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 
15:49:15.334484 IP [some ip].14386 > 224.0.31.155.14386: UDP, length 1364 
15:49:15.334728 IP [some ip].14386 > 224.0.31.155.14386: UDP, length 1374 
15:49:15.375026 IP [some ip].14386 > 224.0.31.155.14386: UDP, length 1058 
15:49:15.375184 IP [some ip].14386 > 224.0.31.155.14386: UDP, length 832 

Однако, если я убью мой процесс Iperf выше, а затем начать мой C++, которое также объединяет одну и ту же группу и связывает один и тот же порт, tcpdump больше не видит трафик.

Вот фрагмент кода:

struct sockaddr_in mc_addr; /* socket address structure */ 
struct ip_mreq mc_req; /* multicast request structure */ 
unsigned int from_len = sizeof(mc_addr); /* source addr length */ 

/* construct a multicast address structure */ 
memset(&mc_addr, 0, from_len); 
mc_addr.sin_family = AF_INET; 
inet_aton(mcastGroup.c_str(), &mc_addr.sin_addr); 
mc_addr.sin_port = htons(port); 

/* bind to multicast address to socket */ 
if (bind(s, (struct sockaddr *) &mc_addr, sizeof(mc_addr)) < 0) { 
    std::cerr << "failed to bind to the port " << port << "|error=" 
      << strerror(errno) << std::endl; 
    throw; 
} 
/* construct an IGMP join request structure */ 
mc_req.imr_multiaddr.s_addr = inet_addr(mcastGroup.c_str()); 
mc_req.imr_interface.s_addr = htonl(INADDR_ANY); 

/* send an ADD MEMBERSHIP message via setsockopt */ 
if ((setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, 
     sizeof(mc_req))) < 0) { 
    std::cerr << "failed to set socket option to request for membership" 
      << std::endl; 
    throw; 
} 

Tcpdump детали:

$ tcpdump --version 
tcpdump version 4.1-PRE-CVS_2012_03_26 
libpcap version 1.4.0 

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

Любая идея, что происходит?

+0

Я не уверен, что будет делать 'IP_ADD_MEMBERSHIP', но, вероятно, вам также нужно« слушать » – Ajay

+0

Я использую epoll для отслеживания дескриптора файла, и поэтому listen() не требуется. – Hei

+0

Вы можете записывать данные только за счет запуска «iperf -s -u -B 224.0.31.155»? Кажется, что вы просто запускаете сервер, который прослушивает. Ваш код предназначен для генерации многоадресного трафика, он, похоже, отличается от вашей команды iperf. Вы можете дать более подробную информацию ? –

ответ

0

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

Если вы хотите только отправить UDP-пакеты, которые вам не нужно связывать сокет. ОС сделает это за вас.

Если вы хотите отправлять и получать многоадресный трафик, скорее всего, вы хотите привязать его к INADDR_ANY на Linux. Это почти идиома. bind() на UDP-сокетах имеет очень неинтуитивную семантику в Linux. IP-адрес имеет только фильтрующую роль. Он не привязывается к указанному IP-адресу и не привязывается к интерфейсу, связанному с этим IP-адресом.

Еще одна особенность заключается в том, что вы назначаете mc_req.imr_interface, который не должен быть членом ip_mreq. Я думаю, что это должно быть прочитано mc_req.imr_address, но, конечно, если это скомпилируется, я буду молчать.

+0

Спасибо за ваш комментарий. Я просто хотел получать сообщения mcast. И да, он соблюдал штраф. – Hei

0

Сообщения IGMP сохраняются. Если хост уже является членом группы, он не будет отправлять новое сообщение отчета членства IGMP, когда присоединяется другое приложение. Если вы получаете многоадресные рассылки, будьте счастливы.

+0

Я поднял этот вопрос, потому что однажды мне нужно использовать tcpdump для диагностики проблем производства. – Hei

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

  • Нет связанных вопросов^_^