17.2。 ソケット —低レベルのネットワークインターフェイス
このモジュールは、BSD socket インターフェースへのアクセスを提供します。 これは、すべての最新のUnixシステム、Windows、Mac OS X、BeOS、OS / 2、およびおそらく追加のプラットフォームで利用できます。
ノート
オペレーティングシステムのソケットAPIが呼び出されるため、一部の動作はプラットフォームに依存する場合があります。
ソケットプログラミングの概要(C)については、次の論文を参照してください。StuartSechrestによる入門4.3BSDプロセス間通信チュートリアルおよびSamuelJによる高度な4.3BSDプロセス間通信チュートリアル。 Leffler et al、UNIXプログラマーズマニュアル、補足文書1(セクションPS1:7およびPS1:8)の両方。 さまざまなソケット関連のシステムコールに関するプラットフォーム固有のリファレンス資料も、ソケットセマンティクスの詳細に関する貴重な情報源です。 Unixについては、マニュアルページを参照してください。 Windowsの場合は、WinSock(またはWinsock 2)の仕様を参照してください。 IPv6対応APIの場合、読者は RFC 3493 というタイトルのIPv6の基本的なソケットインターフェイス拡張機能を参照することをお勧めします。
Pythonインターフェースは、ソケット用のUnixシステムコールとライブラリインターフェースをPythonのオブジェクト指向スタイルに簡単に変換したものです。 socket()関数は、さまざまなメソッドを実装するソケットオブジェクトを返します。ソケットシステムコール。 パラメータタイプはCインターフェイスよりもいくらか高レベルです。Pythonファイルでのread()
およびwrite()
操作と同様に、受信操作でのバッファ割り当ては自動であり、バッファ長は送信操作で暗黙的です。
ソケットアドレスは次のように表されます。 AF_UNIX アドレスファミリには単一の文字列が使用されます。 ペア(host, port)
は AF_INET アドレスファミリに使用されます。ここで、 host は、'daring.cwi.nl'
のようなインターネットドメイン表記のホスト名または'100.50.200.5'
やポートなどのIPv4アドレスは整数です。 AF_INET6 アドレスファミリの場合、4タプル(host, port, flowinfo, scopeid)
が使用されます。ここで、 flowinfo および scopeid はsin6_flowinfo
およびsin6_scope_id
メンバー。 socket モジュールメソッドの場合、下位互換性のために flowinfo および scopeid を省略できます。 ただし、 scopeid を省略すると、スコープ付きIPv6アドレスの操作で問題が発生する可能性があることに注意してください。 他のアドレスファミリは現在サポートされていません。 特定のソケットオブジェクトに必要なアドレス形式は、ソケットオブジェクトの作成時に指定されたアドレスファミリに基づいて自動的に選択されます。
IPv4アドレスの場合、ホストアドレスの代わりに2つの特別な形式が受け入れられます。空の文字列はINADDR_ANY
を表し、文字列'<broadcast>'
はINADDR_BROADCAST
を表します。 この動作は、下位互換性のためにIPv6では使用できません。したがって、PythonプログラムでIPv6をサポートする場合は、これらを回避することをお勧めします。
IPv4 / v6ソケットアドレスの host 部分でホスト名を使用すると、PythonがDNS解決から返された最初のアドレスを使用するため、プログラムが非決定的な動作を示す場合があります。 ソケットアドレスは、DNS解決やホスト構成の結果に応じて、実際のIPv4 / v6アドレスに異なる方法で解決されます。 決定論的な動作を行うには、 host の部分に数値アドレスを使用します。
バージョン2.5の新機能: AF_NETLINKソケットはペアpid, groups
として表されます。
バージョン2.6の新機能: TIPCのLinuxのみのサポートは、AF_TIPC
アドレスファミリを使用して利用することもできます。 TIPCは、クラスター化されたコンピューター環境で使用するために設計された、オープンな非IPベースのネットワークプロトコルです。 アドレスはタプルで表され、フィールドはアドレスタイプによって異なります。 一般的なタプル形式は(addr_type, v1, v2, v3 [, scope])
です。ここで、
addr_type は、
TIPC_ADDR_NAMESEQ
、TIPC_ADDR_NAME
、またはTIPC_ADDR_ID
のいずれかです。スコープは、
TIPC_ZONE_SCOPE
、TIPC_CLUSTER_SCOPE
、およびTIPC_NODE_SCOPE
のいずれかです。addr_type が
TIPC_ADDR_NAME
の場合、 v1 はサーバーの種類、 v2 はポート識別子、 v3 はポート識別子です。 0になります。addr_type が
TIPC_ADDR_NAMESEQ
の場合、 v1 はサーバーの種類、 v2 は小さい方のポート番号、 v3 は上位ポート番号です。addr_type が
TIPC_ADDR_ID
の場合、 v1 がノード、 v2 が参照、 v3 を設定する必要があります0に。
すべてのエラーは例外を発生させます。 無効な引数タイプとメモリ不足状態の通常の例外が発生する可能性があります。 ソケットまたはアドレスのセマンティクスに関連するエラーは、エラー socket.error を発生させます。
非ブロッキングモードは、 setblocking()でサポートされています。 タイムアウトに基づくこれの一般化は、 settimeout()によってサポートされます。
モジュール socket は、次の定数と関数をエクスポートします。
- exception socket.error
この例外は、ソケット関連のエラーに対して発生します。 付随する値は、 os.error に付随する値と同様に、問題が発生したことを示す文字列、またはシステムコールによって返されるエラーを表すペア
(errno, string)
のいずれかです。 モジュール errno を参照してください。このモジュールには、基盤となるオペレーティングシステムによって定義されたエラーコードの名前が含まれています。バージョン2.6で変更: socket.error は
IOError
の子クラスになりました。
- exception socket.herror
この例外は、アドレス関連のエラー、つまり gethostbyname_ex()や gethostbyaddr()など、CAPIで h_errno を使用する関数の場合。
付随する値は、ライブラリ呼び出しによって返されたエラーを表すペア
(h_errno, string)
です。 string は、hstrerror()
C関数によって返される、 h_errno の説明を表します。
- exception socket.gaierror
- この例外は、 getaddrinfo()および getnameinfo()のアドレス関連エラーで発生します。 付随する値は、ライブラリ呼び出しによって返されたエラーを表すペア
(error, string)
です。 string は、gai_strerror()
C関数によって返されるエラーの説明を表します。 error 値は、このモジュールで定義されているEAI_*
定数の1つと一致します。
- exception socket.timeout
この例外は、
settimeout()
への以前の呼び出しによってタイムアウトが有効になっているソケットでタイムアウトが発生した場合に発生します。 付随する値は、現在常に「タイムアウト」している値の文字列です。バージョン2.3の新機能。
- socket.AF_UNIX
socket.AF_INET
socket.AF_INET6
- socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
- これらの定数は、 socket()の2番目の引数に使用されるソケットタイプを表します。 ( SOCK_STREAM と SOCK_DGRAM のみが一般的に役立つようです。)
- SO_*
socket.SOMAXCONN
MSG_*
SOL_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*
- ソケットやIPプロトコルに関するUnixのドキュメントに記載されているこれらの形式の定数の多くは、ソケットモジュールでも定義されています。 これらは通常、ソケットオブジェクトの
setsockopt()
およびgetsockopt()
メソッドの引数で使用されます。 ほとんどの場合、Unixヘッダーファイルで定義されているシンボルのみが定義されます。 いくつかの記号については、デフォルト値が提供されています。
- SIO_*
RCVALL_* WindowsのWSAIoctl()の定数。 定数は、ソケットオブジェクトの ioctl()メソッドへの引数として使用されます。
バージョン2.6の新機能。
- TIPC_*
CソケットAPIによってエクスポートされたものと一致するTIPC関連の定数。 詳細については、TIPCのドキュメントを参照してください。
バージョン2.6の新機能。
- socket.has_ipv6
この定数には、このプラットフォームでIPv6がサポートされているかどうかを示すブール値が含まれています。
バージョン2.3の新機能。
- socket.create_connection(address[, timeout[, source_address]])
インターネットアドレス(2タプル
(host, port)
)でリッスンしているTCPサービスに接続し、ソケットオブジェクトを返します。 これは socket.connect()よりも高レベルの関数です。 host が数値以外のホスト名の場合、両方の AF_INET に対して解決を試みます。および AF_INET6 を選択し、接続が成功するまで、考えられるすべてのアドレスに順番に接続してみます。 これにより、IPv4とIPv6の両方と互換性のあるクライアントを簡単に作成できます。オプションの timeout パラメーターを渡すと、接続を試行する前にソケットインスタンスのタイムアウトが設定されます。 timeout が指定されていない場合、 getdefaulttimeout()によって返されるグローバルデフォルトタイムアウト設定が使用されます。
指定する場合、接続する前にソケットを送信元アドレスとしてバインドするには、 source_address を2タプル
(host, port)
にする必要があります。 ホストまたはポートがそれぞれ または0の場合、OSのデフォルトの動作が使用されます。バージョン2.6の新機能。
バージョン2.7で変更: source_address が追加されました。
- socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
host / port 引数を、そのサービスに接続されたソケットを作成するために必要なすべての引数を含む5タプルのシーケンスに変換します。 host はドメイン名であり、IPv4 / v6アドレスまたは
None
の文字列表現です。 port は、'http'
、数値のポート番号、None
などの文字列サービス名です。None
を host および port の値として渡すことにより、NULL
を基盤となるCAPIに渡すことができます。ファミリ、 socktype 、および proto 引数は、返されるアドレスのリストを絞り込むためにオプションで指定できます。 デフォルトでは、それらの値は
0
であり、結果の全範囲が選択されていることを意味します。 flags 引数は、AI_*
定数の1つまたは複数にすることができ、結果の計算方法と返される方法に影響を与えます。 デフォルト値は0
です。 たとえば、AI_NUMERICHOST
はドメイン名の解決を無効にし、 host がドメイン名の場合はエラーを発生させます。この関数は、次の構造を持つ5タプルのリストを返します。
(family, socktype, proto, canonname, sockaddr)
これらのタプルでは、ファミリ、 socktype 、 proto はすべて整数であり、 socket()関数に渡されることを意図しています。 canonname は、
AI_CANONNAME
が flags 引数の一部である場合、 host の正規名を表す文字列になります。 それ以外の場合、 canonname は空になります。 sockaddr は、ソケットアドレスを記述するタプルであり、その形式は、返されるファミリ( AF_INET の(address, port)
2-タプル、[ X162X] AF_INET6 )の4タプルであり、 socket.connect()メソッドに渡されることを意図しています。次の例では、ポート80で
example.org
への架空のTCP接続のアドレス情報をフェッチします(IPv6が有効になっていない場合、システムによって結果が異なる場合があります)。>>> socket.getaddrinfo("example.org", 80, 0, 0, socket.IPPROTO_TCP) [(10, 1, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (2, 1, 6, '', ('93.184.216.34', 80))]
バージョン2.2の新機能。
- socket.getfqdn([name])
name の完全修飾ドメイン名を返します。 name が省略されているか空の場合、ローカルホストとして解釈されます。 完全修飾名を見つけるために、 gethostbyaddr()によって返されるホスト名がチェックされ、利用可能な場合はホストのエイリアスが続きます。 ピリオドを含む名が選択されます。 完全修飾ドメイン名が利用できない場合は、 gethostname()によって返されるホスト名が返されます。
バージョン2.0の新機能。
- socket.gethostbyname(hostname)
- ホスト名をIPv4アドレス形式に変換します。 IPv4アドレスは、
'100.50.200.5'
などの文字列として返されます。 ホスト名がIPv4アドレス自体の場合、変更されずに返されます。 より完全なインターフェースについては、 gethostbyname_ex()を参照してください。 gethostbyname()はIPv6名前解決をサポートしていません。代わりに、 getaddrinfo()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
- socket.gethostbyname_ex(hostname)
- ホスト名をIPv4アドレス形式、拡張インターフェースに変換します。 トリプル
(hostname, aliaslist, ipaddrlist)
を返します。ここで、 hostname は、指定された ip_address に応答するプライマリホスト名です。 aliaslist は、代替の(おそらく空の)リストです。同じアドレスのホスト名。 ipaddrlist は、同じホスト上の同じインターフェイスのIPv4アドレスのリストです(多くの場合、単一のアドレスであるとは限りません)。 gethostbyname_ex()はIPv6名前解決をサポートしていません。代わりに、 getaddrinfo()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
- socket.gethostname()
Pythonインタープリターが現在実行されているマシンのホスト名を含む文字列を返します。
現在のマシンのIPアドレスを知りたい場合は、
gethostbyname(gethostname())
を使用することをお勧めします。 この操作は、ホストに有効なアドレスからホストへのマッピングがあることを前提としており、その前提が常に当てはまるとは限りません。注: gethostname()は、完全修飾ドメイン名を常に返すとは限りません。
getfqdn()
を使用します(上記を参照)。
- socket.gethostbyaddr(ip_address)
- トリプル
(hostname, aliaslist, ipaddrlist)
を返します。ここで、 hostname は、指定された ip_address に応答するプライマリホスト名です。 aliaslist は、代替の(おそらく空の)リストです。同じアドレスのホスト名。 ipaddrlist は、同じホスト上の同じインターフェイスのIPv4 / v6アドレスのリストです(ほとんどの場合、単一のアドレスのみが含まれます)。 完全修飾ドメイン名を見つけるには、関数 getfqdn()を使用します。 gethostbyaddr()は、IPv4とIPv6の両方をサポートします。
- socket.getnameinfo(sockaddr, flags)
ソケットアドレス sockaddr を2タプル
(host, port)
に変換します。 フラグの設定に応じて、結果にはホストの完全修飾ドメイン名または数値アドレス表現が含まれる場合があります。 同様に、 port には、文字列のポート名または数値のポート番号を含めることができます。バージョン2.2の新機能。
- socket.getprotobyname(protocolname)
- インターネットプロトコル名(たとえば、
'icmp'
)を、 socket()関数に(オプションの)3番目の引数として渡すのに適した定数に変換します。 これは通常、「raw」モード( SOCK_RAW )で開かれたソケットにのみ必要です。 通常のソケットモードでは、プロトコルが省略されているかゼロの場合、正しいプロトコルが自動的に選択されます。
- socket.getservbyname(servicename[, protocolname])
- インターネットサービス名とプロトコル名をそのサービスのポート番号に変換します。 オプションのプロトコル名を指定する場合は、
'tcp'
または'udp'
にする必要があります。そうでない場合、どのプロトコルも一致します。
- socket.getservbyport(port[, protocolname])
- インターネットポート番号とプロトコル名をそのサービスのサービス名に変換します。 オプションのプロトコル名を指定する場合は、
'tcp'
または'udp'
にする必要があります。そうでない場合、どのプロトコルも一致します。
- socket.socket([family[, type[, proto]]])
- 指定されたアドレスファミリ、ソケットタイプ、およびプロトコル番号を使用して、新しいソケットを作成します。 アドレスファミリは、 AF_INET (デフォルト)、 AF_INET6 、または AF_UNIX である必要があります。 ソケットタイプは、 SOCK_STREAM (デフォルト)、 SOCK_DGRAM 、または他の
SOCK_
定数のいずれかである必要があります。 プロトコル番号は通常ゼロであり、その場合は省略できます。
- socket.socketpair([family[, type[, proto]]])
指定されたアドレスファミリ、ソケットタイプ、およびプロトコル番号を使用して、接続されたソケットオブジェクトのペアを構築します。 アドレスファミリ、ソケットタイプ、プロトコル番号は、上記の socket()関数と同じです。 プラットフォームで定義されている場合、デフォルトのファミリは AF_UNIX です。 それ以外の場合、デフォルトは AF_INET です。 可用性:Unix。
バージョン2.4の新機能。
- socket.fromfd(fd, family, type[, proto])
- ファイル記述子 fd (ファイルオブジェクトの
fileno()
メソッドによって返される整数)を複製し、その結果からソケットオブジェクトを構築します。 アドレスファミリ、ソケットタイプ、プロトコル番号は、上記の socket()関数と同じです。 ファイル記述子はソケットを参照する必要がありますが、これはチェックされません。ファイル記述子が無効な場合、オブジェクトに対する後続の操作が失敗する可能性があります。 この関数が必要になることはめったにありませんが、標準の入力または出力としてプログラムに渡されるソケット(Unix inetデーモンによって起動されるサーバーなど)でソケットオプションを取得または設定するために使用できます。 ソケットはブロッキングモードであると見なされます。 可用性:Unix。
- socket.ntohl(x)
- 32ビットの正の整数をネットワークからホストのバイト順序に変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、4バイトのスワップ操作を実行します。
- socket.ntohs(x)
- 16ビットの正の整数をネットワークからホストのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、2バイトのスワップ操作を実行します。
- socket.htonl(x)
- 32ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、4バイトのスワップ操作を実行します。
- socket.htons(x)
- 16ビットの正の整数をホストからネットワークのバイトオーダーに変換します。 ホストのバイト順序がネットワークのバイト順序と同じであるマシンでは、これは何もしません。 それ以外の場合は、2バイトのスワップ操作を実行します。
- socket.inet_aton(ip_string)
IPv4アドレスをドット付き4進文字列形式(たとえば、「123.45.67.89」)から4文字の長さの文字列として32ビットパックバイナリ形式に変換します。 これは、標準Cライブラリを使用し、この関数が返す32ビットパックバイナリのCタイプであるタイプ
struct in_addr
のオブジェクトを必要とするプログラムと会話するときに役立ちます。inet_aton()は、ドットが3つ未満の文字列も受け入れます。 詳細については、Unixのマニュアルページ inet(3)を参照してください。
この関数に渡されたIPv4アドレス文字列が無効な場合、 socket.error が発生します。 正確に何が有効かは、
inet_aton()
の基礎となるC実装に依存することに注意してください。inet_aton()はIPv6をサポートしていません。代わりに、 inet_pton()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
- socket.inet_ntoa(packed_ip)
32ビットのパックされたIPv4アドレス(長さが4文字の文字列)を標準のドット付きクワッド文字列表現(たとえば、「123.45.67.89」)に変換します。 これは、標準Cライブラリを使用し、
struct in_addr
型のオブジェクトを必要とするプログラムと会話するときに役立ちます。これは、この関数が引数として取る32ビットパックバイナリデータのC型です。この関数に渡される文字列の長さが正確に4バイトでない場合、 socket.error が発生します。 inet_ntoa()はIPv6をサポートしていません。代わりに、 inet_ntop()をIPv4 / v6デュアルスタックサポートに使用する必要があります。
- socket.inet_pton(address_family, ip_string)
IPアドレスをファミリ固有の文字列形式からパックされたバイナリ形式に変換します。 inet_pton()は、ライブラリまたはネットワークプロトコルがタイプ
struct in_addr
( inet_aton()と同様)またはstruct in6_addr
のオブジェクトを呼び出す場合に役立ちます。address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 IPアドレス文字列 ip_string が無効な場合、 socket.error が発生します。 正確に何が有効かは、 address_family の値と
inet_pton()
の基礎となる実装の両方に依存することに注意してください。可用性:Unix(すべてのプラットフォームではないかもしれません)。
バージョン2.3の新機能。
- socket.inet_ntop(address_family, packed_ip)
パックされたIPアドレス(いくつかの文字数の文字列)を、標準のファミリ固有の文字列表現(
'7.10.0.5'
または'5aef:2b::8'
など)に変換します inet_ntop()ライブラリまたはネットワークプロトコルがタイプstruct in_addr
( inet_ntoa()と同様)またはstruct in6_addr
のオブジェクトを返す場合に役立ちます。address_family でサポートされている値は、現在 AF_INET および AF_INET6 です。 文字列 packed_ip が指定されたアドレスファミリに対して正しい長さでない場合、
ValueError
が発生します。 socket.error は、 inet_ntop()の呼び出しからのエラーに対して発生します。可用性:Unix(すべてのプラットフォームではないかもしれません)。
バージョン2.3の新機能。
- socket.getdefaulttimeout()
新しいソケットオブジェクトのデフォルトのタイムアウトを秒単位(float)で返します。
None
の値は、新しいソケットオブジェクトにタイムアウトがないことを示します。 ソケットモジュールが最初にインポートされるとき、デフォルトはNone
です。バージョン2.3の新機能。
- socket.setdefaulttimeout(timeout)
新しいソケットオブジェクトのデフォルトのタイムアウトを秒(float)で設定します。
None
の値は、新しいソケットオブジェクトにタイムアウトがないことを示します。 ソケットモジュールが最初にインポートされるとき、デフォルトはNone
です。バージョン2.3の新機能。
- socket.SocketType
- これは、ソケットオブジェクトタイプを表すPythonタイプオブジェクトです。
type(socket(...))
と同じです。
17.2.1。 ソケットオブジェクト
ソケットオブジェクトには次のメソッドがあります。 makefile()
を除いて、これらはソケットに適用可能なUnixシステムコールに対応します。
- socket.accept()
- 接続を受け入れます。 ソケットはアドレスにバインドされ、接続をリッスンする必要があります。 戻り値はペア
(conn, address)
です。ここで、 conn は接続でデータを送受信するために使用できる new ソケットオブジェクトであり、 address は接続のもう一方の端にあるソケットにバインドされているアドレス。
- socket.bind(address)
ソケットをアドレスにバインドします。 ソケットはまだバインドされていない必要があります。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
ノート
このメソッドは、これまで、タプルだけでなく、 AF_INET アドレスのパラメーターのペアを受け入れてきました。 これは意図的なものではなく、Python2.0以降では使用できなくなりました。
- socket.close()
ソケットを閉じます。 ソケットオブジェクトに対する今後のすべての操作は失敗します。 リモートエンドはそれ以上データを受信しません(キューに入れられたデータがフラッシュされた後)。 ソケットは、ガベージコレクションされると自動的に閉じられます。
ノート
close()は、接続に関連付けられているリソースを解放しますが、必ずしもすぐに接続を閉じるとは限りません。 タイムリーに接続を閉じたい場合は、 close()の前に shutdown()を呼び出してください。
- socket.connect(address)
アドレスのリモートソケットに接続します。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
ノート
このメソッドは、これまで、タプルだけでなく、 AF_INET アドレスのパラメーターのペアを受け入れてきました。 これは意図的なものではなく、Python2.0以降では使用できなくなりました。
- socket.connect_ex(address)
connect(address)
と同様ですが、Cレベルのconnect()
呼び出しによって返されるエラーの例外を発生させる代わりに、エラーインジケーターを返します(「ホストが見つかりません」などの他の問題でも例外が発生する可能性があります) 。 操作が成功した場合、エラーインジケータは0
です。それ以外の場合、errno
変数の値です。 これは、たとえば非同期接続をサポートするのに役立ちます。ノート
このメソッドは、これまで、タプルだけでなく、 AF_INET アドレスのパラメーターのペアを受け入れてきました。 これは意図的なものではなく、Python2.0以降では使用できなくなりました。
- socket.fileno()
ソケットのファイル記述子(小さな整数)を返します。 これは、 select.select()で役立ちます。
Windowsでは、このメソッドによって返される小さな整数は、ファイル記述子を使用できる場所では使用できません( os.fdopen()など)。 Unixにはこの制限はありません。
- socket.getpeername()
- ソケットが接続されているリモートアドレスを返します。 これは、たとえば、リモートIPv4 / v6ソケットのポート番号を見つけるのに役立ちます。 (返されるアドレスの形式は、アドレスファミリによって異なります。上記を参照してください。)一部のシステムでは、この機能はサポートされていません。
- socket.getsockname()
- ソケット自体のアドレスを返します。 これは、たとえば、IPv4 / v6ソケットのポート番号を見つけるのに役立ちます。 (返されるアドレスの形式は、アドレスファミリによって異なります。上記を参照してください。)
- socket.getsockopt(level, optname[, buflen])
- 指定されたソケットオプションの値を返します(Unixのマニュアルページ getsockopt(2)を参照)。 必要なシンボリック定数(
SO_*
など)は、このモジュールで定義されています。 buflen がない場合、整数オプションが想定され、その整数値が関数によって返されます。 buflen が存在する場合、オプションを受け取るために使用されるバッファーの最大長を指定し、このバッファーは文字列として返されます。 バッファの内容をデコードするのは呼び出し元の責任です(文字列としてエンコードされたC構造体をデコードする方法については、オプションの組み込みモジュール struct を参照してください)。
- socket.ioctl(control, option)
- プラットホーム
ウィンドウズ
ioctl()メソッドは、WSAIoctlシステムインターフェイスへの制限されたインターフェイスです。 詳細については、 Win32ドキュメントを参照してください。
他のプラットフォームでは、汎用の fcntl.fcntl()および fcntl.ioctl()関数を使用できます。 最初の引数としてソケットオブジェクトを受け入れます。
バージョン2.6の新機能。
- socket.listen(backlog)
- ソケットへの接続をリッスンします。 backlog 引数は、キューに入れられた接続の最大数を指定し、少なくとも0である必要があります。 最大値はシステムに依存し(通常は5)、最小値は強制的に0になります。
- socket.makefile([mode[, bufsize]])
ソケットに関連付けられているファイルオブジェクトを返します。 (ファイルオブジェクトはファイルオブジェクトで説明されています。)ファイルオブジェクトは、 close()メソッドが呼び出されたときにソケットを明示的に閉じませんが、ソケットオブジェクトへの参照を削除するだけです。他の場所から参照されていない場合、ソケットが閉じられるようにします。
ソケットはブロッキングモードである必要があります(タイムアウトを設定することはできません)。 オプションの mode および bufsize 引数は、組み込みの file()関数と同じように解釈されます。
ノート
Windowsでは、 makefile()によって作成されたファイルのようなオブジェクトは、 subprocess.Popen()のストリーム引数など、ファイル記述子を持つファイルオブジェクトが必要な場所では使用できません。 。
- socket.recv(bufsize[, flags])
ソケットからデータを受信します。 戻り値は、受信したデータを表す文字列です。 一度に受信できるデータの最大量は、 bufsize で指定されています。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。
ノート
ハードウェアおよびネットワークの現実と最適に一致させるには、 bufsize の値を2の比較的小さい累乗、たとえば4096にする必要があります。
- socket.recvfrom(bufsize[, flags])
- ソケットからデータを受信します。 戻り値はペア
(string, address)
です。ここで、 string は受信したデータを表す文字列であり、 address はデータを送信するソケットのアドレスです。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
- socket.recvfrom_into(buffer[, nbytes[, flags]])
新しい文字列を作成する代わりに、ソケットからデータを受信し、バッファに書き込みます。 戻り値はペア
(nbytes, address)
です。ここで、 nbytes は受信したバイト数であり、 address はデータを送信するソケットのアドレスです。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)バージョン2.5の新機能。
- socket.recv_into(buffer[, nbytes[, flags]])
ソケットから最大 nbytes バイトを受信し、新しい文字列を作成するのではなく、データをバッファに格納します。 nbytes が指定されていない(または0)場合は、指定されたバッファーで使用可能なサイズまで受信します。 受信したバイト数を返します。 オプションの引数フラグの意味については、Unixのマニュアルページ recv(2)を参照してください。 デフォルトはゼロです。
バージョン2.5の新機能。
- socket.send(string[, flags])
- ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 送信されたバイト数を返します。 アプリケーションは、すべてのデータが送信されたことを確認する責任があります。 一部のデータのみが送信された場合、アプリケーションは残りのデータの配信を試みる必要があります。 この概念の詳細については、 Socket Programming HOWTO を参照してください。
- socket.sendall(string[, flags])
- ソケットにデータを送信します。 ソケットはリモートソケットに接続する必要があります。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 send()とは異なり、このメソッドは、すべてのデータが送信されるかエラーが発生するまで、 string からデータを送信し続けます。 成功すると
None
が返されます。 エラーが発生すると、例外が発生し、正常に送信されたデータの量を判別する方法がありません。
- socket.sendto(string, address)
socket.sendto(string, flags, address)
- ソケットにデータを送信します。 宛先ソケットはアドレスで指定されているため、ソケットをリモートソケットに接続しないでください。 オプションの flags 引数は、上記の recv()の場合と同じ意味です。 送信されたバイト数を返します。 (アドレスの形式はアドレスファミリによって異なります—上記を参照してください。)
- socket.setblocking(flag)
- ソケットのブロッキングモードまたは非ブロッキングモードを設定します。 flag が0の場合、ソケットは非ブロッキングに設定され、それ以外の場合はブロッキングモードに設定されます。 最初は、すべてのソケットがブロッキングモードになっています。 非ブロッキングモードで、 recv()呼び出しでデータが見つからない場合、または send()呼び出しでデータをすぐに破棄できない場合、[X142X ]エラー例外が発生します。 ブロッキングモードでは、通話は続行できるようになるまでブロックされます。
s.setblocking(0)
はs.settimeout(0.0)
と同等です。s.setblocking(1)
はs.settimeout(None)
と同等です。
- socket.settimeout(value)
ソケット操作のブロックにタイムアウトを設定します。 value 引数は、秒を表す非負の浮動小数点数、または
None
にすることができます。 floatが指定された場合、操作が完了する前にタイムアウト期間 value が経過すると、後続のソケット操作で timeout 例外が発生します。None
のタイムアウトを設定すると、ソケット操作のタイムアウトが無効になります。s.settimeout(0.0)
はs.setblocking(0)
と同等です。s.settimeout(None)
はs.setblocking(1)
と同等です。バージョン2.3の新機能。
- socket.gettimeout()
ソケット操作に関連するタイムアウトを秒単位(float)で返します。タイムアウトが設定されていない場合は、
None
を返します。 これは、 setblocking()または settimeout()への最後の呼び出しを反映しています。バージョン2.3の新機能。
ソケットのブロックとタイムアウトに関する注意事項:ソケットオブジェクトは、ブロック、非ブロック、またはタイムアウトの3つのモードのいずれかになります。 ソケットは常にブロッキングモードで作成されます。 ブロッキングモードでは、操作が完了するか、システムがエラー(接続のタイムアウトなど)を返すまで、操作がブロックされます。 非ブロッキングモードでは、操作をすぐに完了できない場合、操作は失敗します(残念ながらシステムに依存するエラーが発生します)。 タイムアウトモードでは、ソケットに指定されたタイムアウト内に操作を完了できない場合、またはシステムがエラーを返した場合、操作は失敗します。 setblocking()メソッドは、特定の settimeout()呼び出しの省略形です。
タイムアウトモードは、内部的にソケットを非ブロッキングモードに設定します。 ブロッキングモードとタイムアウトモードは、同じネットワークエンドポイントを参照するファイル記述子とソケットオブジェクト間で共有されます。 この結果、 makefile()メソッドによって返されるファイルオブジェクトは、ソケットがブロッキングモードの場合にのみ使用する必要があります。 タイムアウトモードまたは非ブロッキングモードでは、すぐに完了できないファイル操作は失敗します。
connect()操作はタイムアウト設定の対象となることに注意してください。通常、 connect()を呼び出す前に、 settimeout()を呼び出すか、パスすることをお勧めします。 create_connection()へのタイムアウトパラメータ。 システムネットワークスタックは、Pythonソケットのタイムアウト設定に関係なく、独自の接続タイムアウトエラーを返す場合があります。
- socket.setsockopt(level, optname, value)
- 指定されたソケットオプションの値を設定します(Unixのマニュアルページ setsockopt(2)を参照)。 必要なシンボリック定数は、 socket モジュール(
SO_*
など)で定義されています。 値は、バッファを表す整数または文字列にすることができます。 後者の場合、文字列に適切なビットが含まれていることを確認するのは呼び出し元の責任です(C構造体を文字列としてエンコードする方法については、オプションの組み込みモジュール struct を参照してください)。
- socket.shutdown(how)
- 接続の一方または両方の半分をシャットダウンします。 how が
SHUT_RD
の場合、それ以上の受信は許可されません。 how がSHUT_WR
の場合、それ以上の送信は許可されません。 how がSHUT_RDWR
の場合、それ以上の送受信は許可されません。 プラットフォームによっては、接続の半分をシャットダウンすると、反対側の半分も閉じる可能性があります(例: Mac OS Xでは、shutdown(SHUT_WR)
は、接続のもう一方の端でそれ以上の読み取りを許可しません)。
read()
またはwrite()
のメソッドはないことに注意してください。 代わりに、 recv()および send()を flags 引数なしで使用してください。
ソケットオブジェクトには、 socket コンストラクターに指定された値に対応するこれらの(読み取り専用)属性もあります。
- socket.family
ソケットファミリ。
バージョン2.5の新機能。
- socket.type
ソケットタイプ。
バージョン2.5の新機能。
- socket.proto
ソケットプロトコル。
バージョン2.5の新機能。
17.2.2。 例
TCP / IPプロトコルを使用する4つの最小限のサンプルプログラムを次に示します。受信したすべてのデータをエコーバックするサーバー(1つのクライアントのみにサービスを提供)と、それを使用するクライアントです。 サーバーはシーケンス socket()、 bind()、 listen()、 accept()を実行する必要があることに注意してください(おそらく繰り返します accept()は複数のクライアントにサービスを提供します)が、クライアントはシーケンス socket()、 connect()のみを必要とします。 また、サーバーは、リッスンしているソケットではなく、 accept()によって返される新しいソケットで sendall() / recv()を実行しないことに注意してください。
最初の2つの例は、IPv4のみをサポートしています。
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
次の2つの例は、上記の2つの例と同じですが、IPv4とIPv6の両方をサポートしています。 サーバー側は、使用可能な最初のアドレスファミリをリッスンします(代わりに両方をリッスンする必要があります)。 ほとんどのIPv6対応システムでは、IPv6が優先され、サーバーはIPv4トラフィックを受け入れない場合があります。 クライアント側は、名前解決の結果として返されたすべてのアドレスに接続しようとし、正常に接続された最初のアドレスにトラフィックを送信します。
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.connect(sa)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
最後の例は、Windowsでrawソケットを使用して非常に単純なネットワークスニファを作成する方法を示しています。 この例では、インターフェイスを変更するために管理者権限が必要です。
import socket
# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# 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))
# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# receive a package
print s.recvfrom(65565)
# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
実行間の遅延が小さすぎる例を数回実行すると、次のエラーが発生する可能性があります。
socket.error: [Errno 98] Address already in use
これは、前回の実行でソケットがTIME_WAIT
状態のままになり、すぐに再利用できないためです。
これを防ぐために、 socket フラグを設定する必要があります。socket.SO_REUSEADDR
:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
SO_REUSEADDR
フラグは、自然なタイムアウトが期限切れになるのを待たずに、TIME_WAIT
状態のローカルソケットを再利用するようにカーネルに指示します。