【问题标题】:Why does a PF_PACKET RAW socket stop missing packets after "Wireshark" was launched?为什么 PF_PACKET RAW 套接字在“Wireshark”启动后停止丢失数据包?
【发布时间】:2015-11-09 04:34:48
【问题描述】:

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

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”也会影响我的套接字接收器?

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

【问题讨论】:

    标签: c packet-sniffers raw-sockets berkeley-sockets


    【解决方案1】:

    使用libpcap 而不是重新发明轮子。

    【讨论】:

    • 首先,使用原始套接字接收原始数据包是使用内核中实现的tcp堆栈,而不是从头开始编写整个代码,因此它不是重新发明轮子。其次,我在看到我没有通过原始套接字接收原始数据包后尝试了它,但它的速度没有可比性。所以我将我的代码转换回使用原始套接字。现在只是想了解为什么他们在通过流套接字发送某些内容后没有收到。
    【解决方案2】:

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

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

    【讨论】:

    • 即使将套接字设置为混杂模式也不能解决问题。
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多