使用PCAP在Linux下获得接口MTU

我有兴趣使用PCAP存储我嗅探的数据包。

由于我预先分配了我需要的内存 – 即我正在嗅探的接口的MTU的倍数,所以我想在打开实时会话之前发现我需要多less内存。

是否有可能查询PCAP获取嗅探接口的MTU?

我怎样才能得到这个信息(可能使用系统库)?

谢谢

linux上的一个选项是/ sys / class / net / devicename中的sysfs文件mtu

$ cat /sys/class/net/eth0/mtu /sys/class/net/lo/mtu 1500 16436 

在PCAP中没有一个简单的方法(没有API)。

但是,对于Linux> = 2.6, Solvent发布了一个简单的解决scheme,即读取如下所示的文件: /sys/class/net/INTERFACE_X/mtu 。 在C中做这件事是微不足道的

 int getMTU(char *name) { FILE *f; char buf[128]; char *line = NULL; ssize_t count; size_t len = 0; int mtu; snprintf(buf, sizeof(buf), "/sys/class/net/%s/mtu", name); f = fopen(buf, "r"); if(!f) { perror("Error opening:"); exit(EXIT_FAILURE); } count = getline(&line, &len, f); if (count == -1) { perror("Error opening:"); exit(EXIT_FAILURE); } sscanf(line, "%d\n", &mtu); fclose(f); return mtu; } 

读取PCAP源代码后,我发现PCAP开发人员使用了一个更复杂,更优雅的解决scheme来读取调用ioctl的接口MTU。 这是我写的一个简化版本:

 #include <sys/ioctl.h> #include <net/if.h> int get_mtu(int fd, const char *device) { struct ifreq ifr; if (!device) return 65535; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFMTU, &ifr) == -1) { perror("Error opening:"); exit(EXIT_FAILURE); } return ifr.ifr_mtu; } 

为进一步的参考,build议man netdevice