내가 실행하는 경우 :tcpdump는 내 C++ 응용 프로그램에 대해 아무것도 표시하지 않습니까?
iperf -s -u -B 224.0.31.155
및
sudo tcpdump -ni any 'host 224.0.31.155'
tcpdump를 실행 뭔가 캡처 할 수있다 : 나는 위의 내 iperf 프로세스를 죽이면, 그러나
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
한 다음 시작 내 동일한 그룹에 참여하고 동일한 포트를 바인드하는 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'이 무슨 일을할지 모르겠지만'listen '해야 할 수도 있습니다. – Ajay
epoll을 사용하여 파일 설명자를 모니터링하므로 listen()가 필요하지 않습니다. – Hei
"iperf -s -u -B 224.0.31.155"를 실행하여 데이터를 캡처 할 수 있습니까? 듣고있는 서버를 시작한 것 같습니다. 여러분의 코드는 멀티 캐스트 트래픽을 생성하는 것입니다. iperf 명령과 다른 기능을 가진 것 같습니다. 더 자세한 정보를 제공 할 수 있습니까? –