3

私は現在、IPv6 リンクローカル アドレスを介してネットワーク通信を行う C++ ライブラリの Python ラッパーを作成しています。ライブラリを初期化するには、ネットワーク インターフェイスを選択する必要があります。これは、目的のインターフェイスのリンクローカル アドレスを介して行われます。

C++ 側では、ブーストaddress_v6 オブジェクトを使用します。Python 側では、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 なしではほとんど不可能です。

ここに何か不足がありますか、それとも IPv6 リンクローカル インターフェイス アドレスを文字列として指定する最良の方法はありますか?

4

2 に答える 2

0

これが意味のあるすべてのケースで、Python ソケット モジュールと同じ構造を使用することをお勧めします。ネイティブ ライブラリを使用することが Python ソケット モジュールを使用しないことを意味する場合でも、一部のデータ構造が 2 つの間で互換性がある場合は、依然として有益です。

IP アドレスを表すために、Python ソケット モジュールは確かに文字列を使用します。また、必要に応じて、その文字列にスコープ ID を含めることができます。

Python ソケット モジュールは、4 つのフィールドで構成されるタプルを使用して、ソケット アドレスを表す必要もあります。たとえば、次のようになります。

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

%eth0スコープ ID はIP アドレス内と2(タプルの最後の要素) の両方で指定されているため、この表現は少し冗長であることに注意してください。

于 2015-03-14T11:42:38.263 に答える