2015-03-13 73 views
1

我目前正在編寫一個C++庫的Python包裝,它通過IPv6鏈接本地地址進行網絡通信。要初始化庫,必須選擇網絡接口。這是通過所需接口的鏈路本地地址完成的。範圍ID在python ipaddress.IPv6Address實例

在C++端我們使用boost address_v6 objects。在蟒蛇方面,ipaddress.IPv6Address似乎是完美的搭配。

但是我沒有找到一種方法來指定python端的接口的作用域id。

ip = ipaddress.IPv6Address('fe80::3c4e:6a7:3f57:4cbc%12') 

給出了錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python34\lib\ipaddress.py", line 1835, in __init__ 
    self._ip = self._ip_int_from_string(addr_str) 
    File "C:\Python34\lib\ipaddress.py", line 1664, in _ip_int_from_string 
    raise AddressValueError("%s in %r" % (exc, ip_str)) from None 
ipaddress.AddressValueError: Only hex digits permitted in '4cbc%12' in 'fe80::3c4e:6a7:3f57:4cbc%12' 

IPv6鏈路本地通信幾乎是不可能沒有範圍的ID。

我在這裏丟失了什麼,或者是將鏈路本地接口地址指定爲字符串的最佳方式?

回答

0

我推薦在所有這些情況下使用與Python插座模塊相同的結構。即使使用您的本地庫意味着Python套接字模塊不會被使用,但如果某些數據結構在兩者之間兼容,它仍然是有益的。

對於表示IP地址,Python套接字模塊確實使用了一個字符串。並且該字符串可以在適當的時候包含範圍ID。

Python套接字模塊也需要表示套接字地址,爲此它使用由四個字段組成的元組。它可以例如是:

('ff02::2%eth0', 80, 0, 2) 

注意,這表示是略多餘的,因爲範圍ID被既作爲%eth0的IP地址和內部作爲2(該元組的最後一個元素)來指定。

+0

謝謝你的提示,這似乎是一個不錯的選擇。 – wetzeld 2015-03-15 19:30:22

+0

看到我的解決方案。和我的PR有關冗餘 – socketpair 2018-01-26 16:41:55