gpt4 book ai didi

c - 为什么 PF_PACKET RAW 套接字在启动 "Wireshark"后停止丢失数据包?

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:53 25 4
gpt4 key购买 nike

我需要使用 RAW 套接字接收传入的 UDP 数据包,该套接字正在使用以下代码片段打开:

static int fd;
char *iface;


iface = "eth0";

if ( (fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0 )
{
perror("socket");
}

if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface)) < 0)
{
perror("bind");
exit(EXIT_FAILURE);
}

例如,我发送了 100 个相同的数据包,然后尝试接收并计算它们。我使用 recv(...) 来做到这一点。只传送了 93 个数据包,然后 recv(...) 挂起等待下一个。但是,如果我在接收方计算机上运行“Wireshark”(使用 libpcap)并让它在“eth0”上监听 UDP 数据包,那么我的应用程序将始终捕获 100 个数据包而不会出现任何问题。

我不明白我到底做错了什么,为什么“Wireshark”也会影响我的套接字接收器?

附言我已经尝试增加接收缓冲区大小,但没有成功。

最佳答案

默认情况下,Wireshark 使用 libpcap 将网络接口(interface)设置为混杂模式: https://github.com/the-tcpdump-group/libpcap/blob/735f1f9d3318693f0096be4198d34e9ac0985777/pcap-linux.c#L3528

尝试在您的代码中添加此 setsockopt 调用,看看是否有帮助。

关于c - 为什么 PF_PACKET RAW 套接字在启动 "Wireshark"后停止丢失数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32035153/

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