我有一个应用程序,可以在端口 4444 上打开设备 (/dev/linkToDevice) 上的套接字。 “linkToDevice”是到 ttyUSB0 的链接。该应用程序是一个 C++ 程序,现在是一个守护程序并在启动时运行。无论网络如何,守护进程都会运行。因此,当Linux机器启动并且没有网络时,守护进程会立即启动,尽管仍然没有网络,但我可以很好地进行通信(telnet localhost 4444)。但是,当我插入网线,或者 dhclient 确定没有 DHCP 并租给我一个默认的 ip 地址,或者我只是简单地给它一个 ip 接口时,我就无法再进行通信了。但是,我仍然可以打开 telnet 连接,只是当我查询连接时没有得到任何响应。
我使用 0.0.0.0 作为打开套接字的 ip(表示任何 ip 地址)。我不觉得这是代码问题。
对我来说奇怪的是,在我无法再通信之后,如果我重新启动守护进程,一切都会正常工作,这是预期的。但是,当我拔掉网络,或取消配置接口,或执行 sudo /etc/init.d/networking 重新启动,或以任何方式关闭网络并重新启动时,在整个过程中,我永远不会失去与设备。因此,只有当我在没有网络的情况下启动机器,然后突然获得网络时,才会出现问题。关于为什么这只在启动时发生的任何想法?
答案1
“主要是我需要知道在无网络情况下启动后第一次获取 eth0 接口与之前建立网络后重新启动网络重新获取 eth0 接口之间的区别。代码适用于后者。”
在以这种方式处理之前,请排除高级网络服务(“NetworkManager”)的恶作剧。我总是禁用它,然后在某个适当的点将命令粘贴到启动过程中(例如,ifconfig eth0 up && dhclient eth0
),然后手动运行其他简单的脚本以从 eth 切换到 wifi 等。 NetworkManager 是一个巨大的自动化章鱼,如果您不知道什么是“接口”,或者正在驾驶笔记本电脑尝试在 Wi-Fi 网络中漫游,但如果您更喜欢自己打开和关闭设备,它可能会做出令人恼火且神秘的选择。我承认从未学习过如何配置它,前提是高级工具比它“管理”的低级工具更难用于执行特定任务,在该任务的上下文中不是合适的工具。
如果不清楚:
当我拔掉网络,或取消配置接口,或执行 sudo /etc/init.d/networking restart 时
/etc/init.d/networking
意味着 .deb 系统(.rpm 使用/etc/init.d/network
)。 禁用这个(和/或使用 upstart 的系统上相应的 upstart 服务)因此它不会在启动时运行,并将其替换为在启动过程后期访问网络所需的任何简单命令。如果存在,我也会注释掉/etc/network/interfaces
除 lo 之外的所有内容。
我通常不会考虑将这个好建议分发给其他用户,但你的问题对我来说只是尖叫,“我猜这是那只巨大的章鱼”——在你查看它背后之前,你确实需要排除这一点。