【发布时间】: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