-5

こんにちは、お騒がせして申し訳ありません。しかし、IPV6へのコードの移植について雑誌で何かを読んだので、このコードを変更してみました(socket.AF_INET6、socket.SOCK_STREAM)

Python では動作しますが、問題はサーバーがクライアント IP を表示しないことです。

このように表示されることを期待していました。('127.0.0.1', 59815) から接続を取得しました。

しかし、それはすべてを台無しにして、これを私に与えます (Got connection from ('::1', 59815, 0, 0)), だから私が尋ねると、クライアントIPはここにありますか?. そして、最後の 2 つのゼロ (0, 0) は実際には何を意味するのでしょうか? また、コードを IPv6 に移植するにはどうすればよいですか? python(geany) を使用していただきありがとうございます

したがって、これを行うと(socket.socket(socket.AF_INET6、socket.SOCK_STREAM))、コードをIPV6に配置できますか、他に行う必要があるものはありますか)

4

1 に答える 1

9

::1はローカルホストのIPv6アドレスであり、ローカルホストのIPv4アドレスと同じ127.0.0.1です。つまり、クライアントのIPv6アドレスが表示されています。

ソケットアドレスのフィールドは、Pythonのsocketドキュメントに記載されています。彼らです:

  • 亭主
  • ポート
  • flowinfo
  • scope-id

Flowinfoとscope-idはIPv6の新機能です。Flowinfoには、 RFC6437で指定されているフローラベルが含まれています。使い方がわからない場合は、そのままにしておいてかまいません0。scope-idは、アドレスが複数のスコープで有効な場合に使用されます。たとえば、 IPv6リンクローカルアドレスはすべてのIPv6インターフェイスで有効ですが、あるインターフェイスから別のインターフェイスにルーティングすることはできません。したがって、リンクローカルアドレスと通信する場合は、使用するインターフェイスを指定する必要があります。scope-idは、インターフェイスの番号です。

コードをIPv6に移植するときは、いくつかのことを考慮する必要があります。すでに変更したソケット処理。また、名前の解決を確認し、IPv4とIPv6の両方をサポートする関数を使用する必要があります(つまり、gethostbyname()を使用せずにgetaddrinfo()などを使用します) 。また、IPアドレスを格納するときに十分なスペースを割り当てることを忘れないでください。IPv6アドレスは、IPv4アドレスよりも多くのスペースを占有します。

PS:IPyライブラリは、IPアドレスを処理するための非常に便利なクラスを提供します。

于 2012-08-13T08:45:39.007 に答える