Если я бег: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++ приложения является правильно обрабатывать данные.
Любая идея, что происходит?
Я не уверен, что будет делать 'IP_ADD_MEMBERSHIP', но, вероятно, вам также нужно« слушать » – Ajay
Я использую epoll для отслеживания дескриптора файла, и поэтому listen() не требуется. – Hei
Вы можете записывать данные только за счет запуска «iperf -s -u -B 224.0.31.155»? Кажется, что вы просто запускаете сервер, который прослушивает. Ваш код предназначен для генерации многоадресного трафика, он, похоже, отличается от вашей команды iperf. Вы можете дать более подробную информацию ? –