我想在Linux中使用交叉电缆连接的两个以太网接口之间发送数据。两个以太网接口在同一个盒子上。我将以太网接口定义为具有不同的静态IP地址(1.2.3.4和5.6.7.8),并且一直使用套接字将字节从一个IP地址发送到另一个IP地址。我想强调一点,我希望数据离开盒子的一个接口,并在同一个盒子的另一个接口上接收。这样做的一个后果是拔掉电缆会阻止客户端和服务器在同一个盒子上进行通信。
我认为内核比我聪明,并且决定它不需要在线路上发送信息并在内部直接在套接字之间路由数据,从而否定了测试。我曾尝试使用SO_BINDTODEVICE强制客户端从特定接口发送数据,但服务器永远不会看到它。我真的被困了,这似乎不应该是这么困难。
路线-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
答案 0 :(得分:1)
尝试使用以下两个IP地址:
我不确定这是不是问题,但1.2.3.4和5.6.7.8不在同一个子网上。 (因为当您将掩码应用于每个掩码时,您不会获得相同的网络地址,因为Dest列会向您显示。)
答案 1 :(得分:1)
如果不通过路由器,则无法在1.2.3.4/24到5.6.7.8/24之间使用IP进行通信。问题是IP只能与同一网段中的其他计算机通信。要计算网络地址,您需要在接口地址和子网掩码之间执行逻辑 AND 。这将为您提供网络地址。如果两个网络地址不同,则需要路由器。在您的示例中,您将具有网络地址1.2.3.0和5.6.7.0。因为它们不同,所以会发送数据。
更重要的是,大多数网络堆栈足够智能,可以看到如果两个接口都在同一台计算机上,它将不会将数据一直发送到物理接口。它可能只通过IP堆栈发送消息。但同样,它需要是vaild地址才能工作。
您甚至可以使用环回网络设备测试类似的设置。 (虚拟网卡。)