我有一个嵌入式系统,它运行一个精简的 Gentoo 用户区,并带有手动构建的内核。系统从 PCI 卡获取数据并将其发送到 UDP 多播组。
所有这些都在旧内核(2.6.11)上运行良好。现在,我更新到了一个稍微年轻的内核(2.6.15),以修复主板在重新启动期间挂起的另一个问题。这修复了重新启动时的挂起问题,但现在向 UDP 多播组发送数据失败。
我在 2.6.15 下调用 sendto 会出现错误 ENOTCONN。但是,链路已连接,我可以通过 TCP 通过该链路发送数据,不会出现任何问题。我的程序没有改变,事实上我什至没有重新编译它。在两个内核下调用 ifconfig eth0 会给出相同的输出。
您知道我在构建 2.6.15 内核时可能配置错误吗?或者 2.6.15 中是否存在错误或 API 发生变化?我无法更新到低于 2.6.15 的任何版本,因为这是系统中 PCI 卡的蹩脚驱动程序支持的最新内核。
答案1
经过 15 个小时的调试,我发现了问题:程序尝试发送极大的数据包,而传递给 sendto 的大小通常超过了 2^16 字节的 UDP 数据包允许的最大大小。现在我添加了一些逻辑,将传递给 sendto 的最大数据包大小设置为 50000,一切都恢复正常。这真的很奇怪,它以前可以在旧内核和 Windows XP 和 7 上运行。
答案2
比较 2.6.11 和 2.6.15 的 .config。我的猜测是,在你的新内核上你有CONFIG_IP_MULTICAST=n
(或者可能有m
)。它应该是y
。