簡體   English   中英

具有多個接口的Python UDP套接字

[英]Python UDP Sockets with Multiple Interfaces

我正在Windows XP機器上的python2.7中編寫腳本。 機器使用不同的網卡連接到多個網絡。

我遇到了一個問題,我將UDP套接字綁定到一個特定的接口(我知道你可以通過提供網卡現有的IP地址在Windows中實現這一點)

self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind(('10.31.9.0', 6466)) #<<< 10.31.9.0 is address of desired card

然后我將超時設置為5秒

self.sock.settimeout(5)

然后我嘗試向服務器發送消息,我可以證明它存在並且有效。 然后等待回復。

self.destintation = ('10.42.40.34', 62434)

# Send the msg
self.sock.sendto(msg, self.destintation)

# receive data
reply, addr = self.sock.recvfrom(1024)

但是總是拋出socket.timeout 所以我打開線鯊看看出了什么問題,事實證明我的初始信息永遠不會在所需的界面上發送。

我所看到的是在我的機器上的不同界面(10.10.10.12)上的arp廣播,詢問誰連接到我想要的目標IP:

1   0.000000    IntelCor_8c:6d:97   Broadcast   ARP 42      Who has 10.42.40.34?  Tell 10.10.10.12

當然沒有對廣播的響應,因為從10.10.10.12接口無法訪問10.42.40.34地址/機器

如何告訴Python在'10.31.9.0'上發送ARP廣播? 我做錯了什么?

編輯:

附加信息>我使用的接口的網絡是B類(網絡掩碼是255.255.0.0)

The interface IP is : 10.31.9.0 

The target IP is: 10.42.40.34. 

我想知道問題是否是我的目標坐在一個單獨的子網上的結果。 然而,作為一個相關的問題描述在這里 從服務器到我的流量... = /

更新:

“route PRINT 10 *”的結果

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
         10.0.0.0        255.0.0.0      10.10.10.12     10.10.10.12   10
      10.10.10.12  255.255.255.255        127.0.0.1       127.0.0.1   10
        10.31.0.0      255.255.0.0        10.31.9.0       10.31.9.0   10
        10.31.9.0  255.255.255.255        127.0.0.1       127.0.0.1   10
   10.255.255.255  255.255.255.255      10.10.10.12     10.10.10.12   10
   10.255.255.255  255.255.255.255        10.31.9.0       10.31.9.0   10
Default Gateway:        153.4.84.1
===========================================================================
Persistent Routes:
  None

更新#2完整路線PRINT

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       153.4.84.1     153.4.85.81   10
        10.10.0.0      255.255.0.0      10.10.10.12     10.10.10.12   10
      10.10.10.12  255.255.255.255        127.0.0.1       127.0.0.1   10
        10.31.0.0      255.255.0.0        10.31.9.0       10.31.9.0   10
        10.31.9.0  255.255.255.255        127.0.0.1       127.0.0.1   10
   10.255.255.255  255.255.255.255      10.10.10.12     10.10.10.12   10
   10.255.255.255  255.255.255.255        10.31.9.0       10.31.9.0   10
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1   1
       153.4.84.0    255.255.252.0      153.4.85.81     153.4.85.81   10
      153.4.85.81  255.255.255.255        127.0.0.1       127.0.0.1   10
    153.4.255.255  255.255.255.255      153.4.85.81     153.4.85.81   10
     192.168.56.0    255.255.255.0     192.168.56.1    192.168.56.1   20
     192.168.56.1  255.255.255.255        127.0.0.1       127.0.0.1   20
   192.168.56.255  255.255.255.255     192.168.56.1    192.168.56.1   20
        224.0.0.0        240.0.0.0      10.10.10.12     10.10.10.12   10
        224.0.0.0        240.0.0.0        10.31.9.0       10.31.9.0   10
        224.0.0.0        240.0.0.0      153.4.85.81     153.4.85.81   10
        224.0.0.0        240.0.0.0     192.168.56.1    192.168.56.1   20
  255.255.255.255  255.255.255.255      10.10.10.12     10.10.10.12   1
  255.255.255.255  255.255.255.255        10.31.9.0       10.31.9.0   1
  255.255.255.255  255.255.255.255      153.4.85.81     153.4.85.81   1
  255.255.255.255  255.255.255.255     192.168.56.1    192.168.56.1   1
  255.255.255.255  255.255.255.255     192.168.56.1               5   1
Default Gateway:        153.4.84.1
===========================================================================
Persistent Routes:
  None

給定“route”的輸出,看起來你是10.10.10.12和10.31.9.0接口配置了重疊的子網。 操作系統選擇將10.10.10.12用於所有10.xxx地址,因為它是第一個適用的規則。

具有重疊的子網通常是網絡配置錯誤:10.10.xx和10.31.xx可能是有效的子網,兩者都應使用255.255.0.0的網絡掩碼,因此10.10.10.12使用的當前255.0.0.0網絡掩碼界面不正確。

(如果打算使所有10.xxx請求使用10.10.10.12接口,除了10.31.xx中應該使用10.31.9.0地址的那些接口,通過更改'度量標准,可能'捏造'修復'10.31.0.0路由規則',以便10.31.xx地址的任何內容與10.xxx規則檢查之前的規則匹配。您可以使用route命令進行更改,但絕對不推薦!修復重疊子網是適當的解決方案。)

事實證明,我的“服務器”發送的數據包不是IP Kosher。 所以他們在網絡和傳輸層遭到拒絕。 解決方案是不使用python套接字類,而是使用winpcap和ctypes直接與OSI-L2通信

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM