gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:53 28 4
gpt4 key购买 nike

如果我运行:

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 进程,然后启动也加入同一组并绑定(bind)同一端口的 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++ 应用程序正在正确处理数据。

知道发生了什么吗?

最佳答案

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

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

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

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

关于c++ - tcpdump 没有为我的 C++ 应用程序显示任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37694024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com