c++ - 在同一个盒子上的两个以太网接口(interface)之间发送数据

标签 c++ sockets ethernet

我想在 Linux 中用交叉电缆连接的两个以太网接口(interface)之间发送数据。两个以太网接口(interface)在同一个盒子上。我将以太网接口(interface)定义为具有不同的静态 IP 地址(1.2.3.4 和 5.6.7.8),并且一直在使用套接字将字节从一个 IP 地址发送到另一个 IP 地址。我想强调的是,我希望数据从盒子的一个接口(interface)离开盒子,并在同一个盒子的另一个接口(interface)上被接收。这样做的一个后果是拔掉电缆会阻止同一盒子上的客户端和服务器之间的通信。

我猜内核比我聪明,它决定不需要通过线路发送信息,而是直接在内部套接字之间路由数据,从而否定了测试。我曾尝试使用 SO_BINDTODEVICE 强制客户端从特定接口(interface)发送数据,但服务器从未看到它。我真的被卡住了,这似乎不应该这么困难。

route-n表中有两条

Dest       Gateway    Genmask        flags  metric  use  interface
1.2.3.0    0.0.0.0    255.255.255.0    U       0     0   eth0
5.6.7.0    0.0.0.0    255.255.255.0    U       0     0   eth1

最佳答案

如果不通过路由器,您无法在 1.2.3.4/24 到 5.6.7.8/24 之间使用 IP 进行通信。问题是IP只能和同一网段的其他电脑对话。要计算网络地址,您需要在接口(interface)地址和子网掩码之间执行逻辑AND。这将为您提供网络地址。如果两个网络地址不同,则需要路由器。在您的示例中,您将拥有网络地址 1.2.3.0 和 5.6.7.0。因为这些不同,所以它会发送数据。

更重要的是,大多数网络堆栈都足够智能,可以看出如果两个接口(interface)都在同一台计算机上,它就不会将数据一路发送到物理接口(interface)。它可能只会通过 IP 堆栈发送消息。但同样,它需要是有效地址才能工作。

您甚至应该能够仅使用环回网络设备来测试类似的设置。 (虚拟网卡。)

关于c++ - 在同一个盒子上的两个以太网接口(interface)之间发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299564/

相关文章:

c++ - 为什么我们在 Boost.ASIO 中需要很多接受器?

ibm-midrange - IBM i (as400) CIM 和以太网接口(interface)

c++ - .get() 重复计算文件末尾的字符

c++ - 为什么 CopyConstructible 类型也必须是 MoveConstructible 类型?

c++ - 如何删除 Windows 10 版本 1809 剪贴板历史记录?

c++ - 比较 C++ 中的结构

java - HTTP 传输错误 : java.net.SocketException:连接重置

sockets - 为什么 FreeBSD 获取 TCP 套接字选项需要锁定写锁?

google-chrome - 如何强制浏览器选项卡(chrome)使用无线和另一个使用以太网电缆?

c# - 监听 TCP 服务器应用程序的以太网电缆拔出事件