Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ tcpdump对我的C++;应用_C++_Centos6_Multicast_Tcpdump_Iperf - Fatal编程技术网

C++ tcpdump对我的C++;应用

C++ tcpdump对我的C++;应用,c++,centos6,multicast,tcpdump,iperf,C++,Centos6,Multicast,Tcpdump,Iperf,如果我跑步: iperf -s -u -B 224.0.31.155 跑 sudo tcpdump -ni any 'host 224.0.31.155' tcpdump能够捕获以下内容: 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

如果我跑步:

iperf -s -u -B 224.0.31.155

sudo tcpdump -ni any 'host 224.0.31.155'
tcpdump能够捕获以下内容:

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

但是,如果我杀死了我的IpFF进程,然后启动我的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;
}

我刚刚在一个生产服务器上检查过,它显示了相同的行为,但是我看到我的C++应用程序正在正确处理数据。


知道发生了什么吗?

代码中的一个潜在问题是将套接字绑定到多播地址。这不是必需的,可能会导致各种奇怪的行为

如果您只想发送UDP数据包,则根本不需要绑定套接字。操作系统会帮你做的

如果您想发送和接收多播流量,您很可能希望绑定到Linux上的INADDR_ANY。这几乎是一个成语bind()在Linux上具有非常不直观的语义。IP地址只是一个过滤角色。它既不绑定到指定的IP地址,也不绑定到与该IP地址关联的接口


另一件奇怪的事情是,您分配给
mc_req.imr_接口
,它不应该是
ip_mreq
的成员。我认为这应该是mc_req.imr_address,但如果编译了,我当然会保持沉默。

IGMP消息被保存。如果主机已经是组的成员,那么当另一个应用程序加入时,它不会发送新的IGMP成员资格报告消息。如果您正在接收多播,请放心。

我不确定
IP\u ADD\u MEMBERSHIP
会做什么,但您可能还需要
listen
我使用epoll监视文件描述符,因此不需要listen()。您只需运行“iperf-s-u-B 224.0.31.155”即可捕获数据?似乎您刚刚启动了一个正在侦听的服务器。您的代码是生成多播流量,它似乎与您的iperf命令具有不同的功能。你能提供更多细节吗?“iperf-s-u”是指支持UDP的“服务器模式”。它不会捕获数据包。它只是加入了多播组,我的代码也是如此——它加入了多播组而没有捕获。@Hei you代码对我很有用,因为我在你的代码片段之后添加了一段睡眠时间,并从其他节点产生了一些流量
iperf-c 224.0.31.155-u-T 32-t1-I 1-p 14386
,也许您可以在代码片段之后添加一些代码来读取数据,看看会得到什么?谢谢您的评论。我只是想接收mcast消息。我提出这个问题是因为有一次我需要使用tcpdump来诊断生产中的问题。谢谢
$ tcpdump --version
tcpdump version 4.1-PRE-CVS_2012_03_26
libpcap version 1.4.0