我的生插座有点小问题。我必须在网络中捕获数据包来修改它们。为此,我必须添加特殊数据,如时间戳。一切都很好,但是我的MTU (Linux)有问题。
如果上层的某些应用程序生成接近MTU的数据包,则无法添加数据。所以我决定缩小系统的MTU。因此,我得到了较小的数据包,这是可能的广告我的数据。但是当我尝试用我的原始套接字发送我的数据包时,它不起作用。
我发现(通过谷歌,在旧的Stackoverflow线程和linux手册中),IP_MTU_DISCOVER可能会有所帮助。但是当我和setsockopt一起使用它时,没有什么变化。
if ((s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)) < 0) {
printf("Error: could not open socket\n");
return -1;
}
char socket_mtu = IP_PMTUDISC_DONT;
setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,socket_mtu, 1);也许这很重要。MTU的缩减已经完成,因为当我添加自己的数据时,产生的数据包不会大于1500 +ETH报头。我的问题是,让原始套接字忽略我的Linux系统的本地MTU。
我看到,当大小太大时,sendto()返回EMSGSIZE (=90)。所以我做了下面的测试。
int k = sendto(s, frame.buffer, frame_len, 0,
(struct sockaddr*)&saddrll, sizeof(saddrll));
printf("K:%i\n", k);调用sendto()后,"k“包含"-1”。但是,如果它取决于数据包的大小,是不是应该是"90"?
当我把我喜欢发送的数据包的大小设置得比MTU小的时候,它工作得很好.有点奇怪。
任何帮助都会很好:)
你好,安德烈亚斯
发布于 2016-07-11 12:43:11
好的。我找到了一个从C程序中更改MTU的解决方案。
buffer.ifr_mtu = 1500;
if(!ioctl(s, SIOCSIFMTU, &buffer)) {
printf("MTU changed\n");
}它第一次起作用。但这只是个工作,不太干净。问题是,如果一个应用程序在我调整MTU大小的时候发送一个数据包,那么这个包可能太大了。有更好的主意吗?
你好,安德烈亚斯
https://stackoverflow.com/questions/38305799
复制相似问题