我的RAW-Socket有一个小问题。我必须在网络中捕获数据包来修改它们。为此,我必须添加特殊数据,如时间戳。一切正常,但我在MTU(Linux)上遇到了问题。
如果上层的某些应用程序生成靠近MTU的数据包,我无法添加我的数据。所以我决定缩小系统的MTU。所以我得到了较小的数据包,可以发布我的数据。但是当我尝试用我的RAW-Socket发送我的数据包时,它无效。
我发现(通过谷歌,在较旧的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-Header。我的问题是,让Raw-Sockets忽略我的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()&#34; k&#34;包含&#34; -1&#34;。但如果它取决于数据包的大小,那就不应该是&#34; 90&#34; ??
当我设置数据包的大小时,我想发送小于MTU的数据,它工作正常....有点奇怪。
任何帮助都会很好: - )
亲切的问候, 安德烈亚斯
答案 0 :(得分:0)
确定。我找到了一个从我的C程序中改变MTU的解决方案。
buffer.ifr_mtu = 1500;
if(!ioctl(s, SIOCSIFMTU, &buffer)) {
printf("MTU changed\n");
}
第一时间它起作用。但它只是一个工作场所,它不是真正干净。问题是,如果应用程序在调整MTU大小的那一刻发送数据包,则数据包可能太大。有更好的想法吗?
亲切的问候, 安德烈亚斯