1

Python で未加工の IPv6 ソケットを使用すると問題が発生します。私は経由して接続します:

    if self._socket != None:
        # Close out old socket first
        self._socket.close()
    self._socket = socket.socket(socket.AF_INET6, socket.SOCK_RAW)
    self._socket.bind((self._interface,0))
    self._socket.sendall(data)

ここで、self._interface はローカル アドレスです。具体的には「fe80::fa1e:dfff:fed6:221d」です。これを試すと、次のエラーが表示されます。

  File "raw.py", line 164, in connect
    self._socket.bind((self._interface,0))
  File "<string>", line 1, in bind
socket.error: [Errno 49] Can't assign requested address

self._interface ("::1") に ipv6 localhost アドレスを使用すると、実際にアドレスをバインドできますが、何も送信できません。

    self._socket.sendall(data)
  File "<string>", line 1, in sendall
socket.error: [Errno 39] Destination address required

raw ソケットに宛先アドレスが必要なのはなぜですか? Python で未加工の IPv6 ソケットを使用した人はいますか?なぜこれが起こっているのかを理解するのに役立ちますか?

4

3 に答える 3

0

このコードは、L2 アクセスを使用する raw ソケットを提供します。残念ながら、OSX は socket.PF_PACKET をサポートしていません...

soc = socket.socket(socket.PF_PACKET, socket.SOCK_RAW) #create the raw-socket
soc.bind(("lo0", 0))

soc.send(packet)
于 2010-10-20T01:56:11.593 に答える
0

bindとの組み合わせがわかりませんsendall。私の理解でbindは、サーバーソケット用でsendallあり、接続が必要です。connectの代わりにということbindですか?

とにかく、INADDR_ANY に相当する IPv6 は、man ページによると、IN6ADDR_ANY_INIT です。'::'Python では定数を定義していませんが、これは(all zero)と同じです。

これは(ルートとして)私にとってはうまくいきました:

>>> import socket
>>> s = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW)
>>> s.bind(('::', 0))

編集: おっと、私は最初にあなたが実際にソケットをアドレスにバインドできたことを知りませんでした。ただし、2 番目の問題は明らかです。データを送信する前に、まず何らかのアドレスに接続する必要があります。またはsendtoアドレスで使用します。これは IPv4 と変わりません。

于 2010-10-20T00:33:27.690 に答える