【发布时间】:2017-02-25 00:20:10
【问题描述】:
我正在运行 Windows 10。 我最近诊断出我的计算机存在问题,发送到多播目标的任何数据包都是通过环回接口而不是“默认”接口发送的(请参阅我的冒险here)。
示例代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b"herpyderp", ('224.0.0.251', 5353))
数据包仅在环回接口上可见(使用 Microsoft Message Analyzer 进行嗅探)。
我尝试通过route print检查路由表,得到如下输出:
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.0.10.138 10.0.10.30 35
10.0.10.0 255.255.255.0 On-link 10.0.10.30 291
10.0.10.30 255.255.255.255 On-link 10.0.10.30 291
10.0.10.255 255.255.255.255 On-link 10.0.10.30 291
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 10.0.10.30 291
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 10.0.10.30 291
===========================================================================
您会注意到该指标表明数据包应通过我的“默认”接口发送。
然后我尝试通过 PowerShell Get-NetIPInterface cmdlet(暗示 here)检查接口指标,并得到以下输出:
ifIndex InterfaceAlias AddressFamily NlMtu(Bytes) InterfaceMetric Dhcp ConnectionState PolicyStore
------- -------------- ------------- ------------ --------------- ---- --------------- -----------
2 Ethernet 3 IPv6 1500 35 Enabled Connected ActiveStore
7 Ethernet IPv6 1500 5 Enabled Disconnected ActiveStore
1 Loopback Pseudo-Interface 1 IPv6 4294967295 75 Disabled Connected ActiveStore
3 isatap.home IPv6 1280 75 Disabled Disconnected ActiveStore
17 Teredo Tunneling Pseudo-Inte... IPv6 1280 75 Enabled Connected ActiveStore
2 Ethernet 3 IPv4 1500 35 Enabled Connected ActiveStore
7 Ethernet IPv4 1500 5 Enabled Disconnected ActiveStore
1 Loopback Pseudo-Interface 1 IPv4 4294967295 75 Disabled Connected ActiveStore
您会注意到InterfaceMetric 字段似乎也表明我的数据包应该通过“默认”接口而不是环回接口发送。
通过s.setsockopt(socket.IP_MULTICAST_IF, ...) 强制套接字通过不同的接口发送数据包有效,但我不需要这样做。
您会注意到,我的主板上有两个以太网接口对应于两个网卡。当我将电缆连接到 Ethernet 而不是 Ethernet 3 时,上面的代码开始按我预期的方式运行,并且数据包是通过该接口而不是通过环回接口发送的。
发生了什么事?
【问题讨论】:
标签: windows sockets windows-10 winsock multicast