![](/img/trans.png)
[英]Reading from PF_PACKET SOCK_RAW with read() misses packets
[英]Why does a PF_PACKET RAW socket stop missing packets after “Wireshark” was launched?
我需要使用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”也影响我的套接字接收器?
PS我已经尝试增加接收缓冲区的大小,但没有成功。
默认情况下,Wireshark使用libpcap将网络接口设置为混杂模式: https : //github.com/the-tcpdump-group/libpcap/blob/735f1f9d3318693f0096be4198d34e9ac0985777/pcap-linux.c#L3528
尝试在代码中添加此setsockopt
调用,以查看是否有帮助。
使用libpcap
代替重新发明轮子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.