【问题标题】:Missing IP_MTU socket option define on Debian Etch?缺少在 Debian Etch 上定义的 IP_MTU 套接字选项?
【发布时间】:2012-05-05 14:55:40
【问题描述】:

我正在尝试使用 IP_MTU 套接字选项读取我的 TCP 连接MTU
根据安装在我的 Debian Etch 上的man 7 ip(我知道,它已经很老了,但现在不能更改它):

SYNOPSIS
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/ip.h> /* superset of previous */
[CUT]
IP_MTU Retrieve the current known path MTU of the current socket.
Only valid when the socket has been  connected.  Returns  an integer.  
Only valid as a getsockopt(2).

问题是上述套接字选项不存在于手册页命名的任何包含文件中。 (因此我的代码没有编译;))
相反,我发现它在 &lt;linux/in.h&gt; 中定义(grep 是你的朋友)
如果我尝试将&lt;linux/in.h&gt; 添加到我的源代码中,我会得到各种多重定义/重新声明编译错误。 有谁知道为什么标题中缺少上述参数以及如何解决该问题?
非常感谢
塞尔吉奥

【问题讨论】:

  • 定义是否仅存在于linux/in.h 中?它不是出现在xxxxx/bits/in.h 中吗? netinet/in.h 似乎包含在 bits 文件夹下的 in.h (至少在我的系统上)。您可以尝试仅查看预处理器输出(使用gcc-E 选项)& grep for "include" 以查看包含的文件并检查其中是否有定义。
  • 似乎唯一定义它的文件是linux/in.hvm-etch-dev32# grep -rn IP_MTU * bits/in.h:61:#define IP_MTU_DISCOVER 10 /* int; see below */ bits/in.h:67:/* IP_MTU_DISCOVER arguments. */ linux/in.h:67:#define IP_MTU_DISCOVER 10 linux/in.h:71:#define IP_MTU 14 linux/in.h:80:/* IP_MTU_DISCOVER values */
  • 够奇怪的bits/in.h 似乎改为为 IPv6 定义 MTU 值:#define IPV6_MTU 24
  • 这很奇怪...bits.h 中第 61 行和第 67 行之间的条目是什么?评论似乎表明这些是IP_MTU_DISCOVER 的参数

标签: c linux sockets debian


【解决方案1】:

答案是:我认为没有答案。我正在运行 Red Hat Enterprise Linux AS 第 4 版(Nahant Update 8),我遇到了完全相同的问题:

  • man 7 ip 说我可以查询 MTU
  • grep -Re IP_MTU /usr/include/* 表示该宏只存在于linux/in.h中
  • 我无法使用 linux/in.h,否则会出现大量错误

所以,我想唯一要做的就是设置 MTU 发现,不断调整 MTU 并观察内核在您尝试发送太大的东西时关闭您。这就是我要做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多