我需要在带有套接字的 C 程序中使用多个网络接口。我的接口是 wlan0 和 eth0。当我连接 eth0 时,通过 wlan0 执行 ping 操作会返回“主机无法访问”,因此通过 wlan0 连接的套接字会返回“连接超时”。如果我运行 ifconfig,它会返回 2 个接口,它们都处于 UP 状态并带有 IP 地址。我如何连接 eth0 和 wlan0?
编辑:
我的基本问题是:为什么当 eth0 已连接时我无法通过 wlan0 访问互联网?
我的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 9 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
我的 iptables:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ifconfig:
eth0 Link encap:Ethernet HWaddr 74:d0:2b:07:3a:dd
inet addr:192.168.1.129 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::76d0:2bff:fe07:3add/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:33194 errors:0 dropped:0 overruns:0 frame:0
TX packets:23759 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:31065847 (31.0 MB) TX bytes:3057118 (3.0 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:21018 errors:0 dropped:0 overruns:0 frame:0
TX packets:21018 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10519343 (10.5 MB) TX bytes:10519343 (10.5 MB)
wlan0 Link encap:Ethernet HWaddr 6c:71:d9:5f:6b:7f
inet addr:10.0.0.6 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::6e71:d9ff:fe5f:6b7f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:34286 errors:0 dropped:0 overruns:0 frame:0
TX packets:26667 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25986919 (25.9 MB) TX bytes:3409031 (3.4 MB)
答案1
IP 协议以及直接位于其上的协议(如 UDP 和 TCP)旨在成为全局协议(尽管存在 NAT),旨在与硬件无关,并且不关心安全性。这意味着:
- 根据设计,任何 IP 地址都应该能够与任何其他 IP 地址进行通信,无论媒体类型如何(以太网、令牌环、无线以太网、SONET 等)
- 因此,根据设计,只有一个顶级网络,即一个“互联网”。
- 从设计上来说,不考虑任何安全性 - IP 数据包的任务是从其源头到达具有其目标 IP 的主机,仅此而已。
- 因此,根据设计,IP 数据包并不关心它经过什么,只要它到达目的地即可
- 因此,根据设计,IP 数据包不关心它来自哪个网络接口(或其他机制 - 例如 PPP)。路由器会关心,因为路由器知道网络接口后面的 IP 地址是什么。
- 当路由器或系统面临通向同一 IP 的多条路径时,它会假定任何一条路径都能以相同的方式工作,并且可以在它们之间进行负载平衡或故障转移到另一条路径。
由于这些原因,标准 C 套接字 API 不支持从特定接口发送流量,您只应该关注目标 IP,而将路由/物理层留给基础设施和操作系统。
因此,您必须执行诸如调整操作系统路由表或使用特定于操作系统的其他功能来完成您想要的操作。