加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

tcpdump没有为我的C应用程序显示任何内容?

发布时间:2020-12-16 06:52:04 所属栏目:百科 来源:网络整理
导读:如果我跑: 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 decodelistening on any,link-type LINUX_SLL (Linux cooked),c
如果我跑:

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

但是,如果我杀死上面的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,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应用程序正在正确处理数据.

知道发生了什么事吗?

解决方法

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

如果您只想发送UDP数据包,则根本不需要绑定套接字.操作系统会为您完成.

如果要发送和接收多播流量,则最有可能希望绑定到Linux上的INADDR_ANY.这几乎是一个习语. UDP套接字上的bind()在Linux上具有非常不直观的语义. IP地址只具有过滤功能.它既不绑定到指定的IP地址,也不绑定到与该IP地址关联的接口.

另一个奇怪的事情是你分配给mc_req.imr_interface,它不应该是ip_mreq的成员.我认为这应该读取mc_req.imr_address,但当然如果这个编译然后我会保持沉默.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读