1

bind()Pythonで生のソケットプログラムを実装していますが、ソケットをインターフェースにバインドできる場所に出くわしました。私が理解しているように、この関数の最初のフィールドは、バインドしたいインターフェースです。 2番目のフィールドは何ですか?これは Ethertype (IP4 など) ですか? Python リファレンス ドキュメントにあるraw ソケットの例では、コードは次のようになります。

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

2 番目のフィールドがゼロなのはなぜですか? 他のでは、これが頻繁に 0x0800 (または 10 進数で 2048) に設定されているのを見たので、これがソケットを IP4 プロトコルに設定している可能性があると私は信じています。この設定が 9999 に設定されていることも確認しました。おそらく、ここで何かを見逃しているか、誤解しています。

4

2 に答える 2

3

2 番目のフィールドは、バインド先のポート番号を示します。ただし、0 に設定すると、OS が 1024 から 65535 の範囲で使用可能なポートを選択できるようになります。

その後、 によって選択されたポートを取得できますsock.getsockname()[1]

また、最初のフィールド (ホスト) を0.0.0.0またはに設定する''と、任意の IPv4 アドレスからの接続を受け入れることができます。


編集: @highlycaffeinated が指摘したように、socket.AF_INETアドレス ファミリが選択されているため、上記は当てはまります。ただし、socket.AF_INET6が選択されている場合、形式は(host, port, flowinfo, scopeid).

于 2012-09-21T16:53:52.360 に答える
1

値は、使用しているアドレス ファミリによって異なります。あなたが示すように、そのAF_INETポート番号です。ドキュメントから:

ソケット アドレスは次のように表されます。 AF_UNIX アドレス ファミリには単一の文字列が使用されます。AF_INET アドレス ファミリには、(ホスト、ポート) のペアが使用されます。ここで、ホストは、「daring.cwi.nl」などのインターネット ドメイン表記のホスト名または「100.50.200.5」などの IPv4 アドレスを表す文字列であり、ポートは整数。AF_INET6 アドレス ファミリの場合、4 つのタプル (ホスト、ポート、フローインフォ、スコープ ID) が使用されます。フローインフォとスコープ ID は、C の struct sockaddr_in6 の sin6_flowinfo と sin6_scope_id メンバーを表します。互換性。ただし、scopeid を省略すると、スコープ付き IPv6 アドレスの操作で問題が発生する可能性があることに注意してください。その他のアドレス ファミリは現在サポートされていません。

于 2012-09-21T16:53:57.117 に答える