##
7.2.1 socket オブジェクト

ソケットオブジェクトは以下のメソッドを持ちます。`makefile()`以外 のメソッドは、Unixのソケット用システムコールに対応しています。

`accept`( | )

  接続を受け付けます。ソケットはアドレスにbind済みで、listen中である必要が あります。戻り値は`(conn, address)`のペアで、conn は接続を通じてデータの送受信を行うための新しいソケットオブジェク ト、addressは接続先でソケットにbindしているアドレスを示します。

`bind`( | address)

  ソケットをaddressにbindします。bind済みのソケットを再バインドする 事はできません。addressのフォーマットはアドレスファミリによって異 なります(前述)。 注意: 本来、このメソッドは単一のタプルのみを引数として受け付けますが、 以前は`AF_INET`アドレスを示す二つの値を指定する事ができました。 これは本来の仕様ではなく、Python 2.0以降では使用することはできません。

`close`( | )

  ソケットをクローズします。以降、このソケットでは全ての操作が失敗します。 リモート端点ではキューに溜まったデータがフラッシュされた後はそれ以上の データを受信しません。ソケットはガベージコレクション時に自動的にクローズ されます。

`connect`( | address)

  addressで示されるリモートソケットに接続します。addressのフ ォーマットはアドレスファミリによって異なります(前述)。 注意: 本来、このメソッドは単一のタプルのみを引数として受け付けますが、 以前は`AF_INET`アドレスを示す二つの値を指定する事ができました。 これは本来の仕様ではなく、Python 2.0以降では使用することはできません。

`connect_ex`( | address)

  `connect(address)`と同様ですが、C言語の`connect()` 関数の呼び出しでエラーが発生した場合には例外を送出せずにエラーを戻り値と して返します。(これ以外の、``host not found,''等のエラーの場合には例外が 発生します。)処理が正常に終了した場合には`0`を返し、エラー時には `errno`の値を返します。この関数は、非同期接続をサポートする場合な どに使用することができます。 注意: 本来、このメソッドは単一のタプルのみを引数として受け付けますが、 以前は`AF_INET`アドレスを示す二つの値を指定する事ができました。 これは本来の仕様ではなく、Python 2.0以降では使用することはできません。

`fileno`( | )

  ソケットのファイルディスクリプタを整数型で返します。ファイルディスクリプ タは、`select.select()`などで使用します。

`getpeername`( | )

  ソケットが接続しているリモートアドレスを返します。この関数は、リモート IPv4/v6ソケットのポート番号を調べる場合などに使用します。addressの フォーマットはアドレスファミリによって異なります(前述)。この関数をサポー トしていないシステムも存在します。

`getsockname`( | )

  ソケット自身のアドレスを返します。この関数は、IPv4/v6ソケットのポート番 号を調べる場合などに使用します。addressのフォーマットはアドレスフ ァミリによって異なります(前述)。

`getsockopt`( | level, optname[, buflen])

  ソケットに指定されたオプションを返します(Unixのマニュアルページ getsockopt(2)を参照)。`SO_*`等のシンボルは、このモジ ュールで定義しています。buflenを省略した場合、取得するオブションは 整数とみなし、整数型の値を戻り値とします。buflenを指定した場合、長 さbuflenのバッファでオプションを受け取り、このバッファを文字列とし て返します。このバッファは、呼び出し元プログラムで`struct` モジュール等を利用して内容を読み取ることができま す。

`listen`( | backlog)

  ソケットをListenし、接続を待ちます。引数backlogには接続キューの最 大の長さ(1以上)を指定します。backlogの最大数はシステムに依存します (通常は5)。

`makefile`( | [mode[, bufsize]])

  ソケットに関連付けられたファイルオブジェクトを返します(ファイルオ ブジェクトについては2.3.8の``ファイルオブジェクト''を 参照)。ファイルオブジェクトはソケットを`dup()`したファイルディ スクリプタを使用しており、ソケットオブジェクトとファイルオブジェクトは 別々にクローズしたりガベージコレクションで破棄したりする事ができます。ソ ケットはブロッキングモードでなければなりません。 オプション引数のmodeとbufsize には、`file()`組み込み関数と同じ値を指定します。 2.1の``組み込み関数''を参照してください。

`recv`( | bufsize[, flags])

  ソケットからデータを受信し、文字列として返します。受信する最大バイト数 は、bufsizeで指定します。flagsのデフォルト値は0です。値の意 味についてはUnixマニュアルページのrecv(2)を参照してくださ い。

`recvfrom`( | bufsize[, flags])

  ソケットからデータを受信し、結果をタプル`(string, address)`として返します。stringは受信データの文字列で、 addressは送信元のアドレスを示します。オプション引数flagsの意 味は、上記`recv()`と同じです。addressのフォーマットはアドレ スファミリによって異なります(前述)。

`send`( | string[, flags])

  ソケットにデータを送信します。ソケットはリモートソケットに接続済みでなけ ればなりません。オプション引数flagsの意味は、上記`recv()`と 同じです。戻り値として、送信したバイト数を返します。アプリケーションで は、必ず戻り値をチェックし、全てのデータが送られた事を確認する必要があり ます。データの一部だけが送信された場合、アプリケーションで残りのデータを 再送信してください。

`sendall`( | string[, flags])

  ソケットにデータを送信します。ソケットはリモートソケットに接続済みでなけ ればなりません。オプション引数flagsの意味は、上記`recv()`と 同じです。`send()`と異なり、このメソッドはstringの全データ を送信するか、エラーが発生するまで処理を継続します。正常終了の場合は `None`を返し、エラー発生時には例外が発生します。エラー発生時、送信 されたバイト数を調べる事はできません。

`sendto`( | string[, flags], address)

  ソケットにデータを送信します。このメソッドでは接続先をaddressで指 定するので、接続済みではいけません。オプション引数flagsの意味は、 上記`recv()`と同じです。戻り値として、送信したバイト数を返しま す。addressのフォーマットはアドレスファミリによって異なります(前 述)。

`setblocking`( | flag)

  ソケットのブロッキング・非ブロッキングモードを指定します。flagが0 の場合は非ブロッキングモード、0以外の場合はブロッキングモードとなりま す。全てのソケットは、初期状態ではブロッキングモードです。非ブロッキング モードでは、`recv()`メソッド呼び出し時に読み込みデータが無かった り`send()`メソッド呼び出し時にデータを処理する事ができないような 場合に`error`例外が発生します。しかし、ブロッキングモードでは 呼び出しは処理が行われるまでブロックされます。`s.setblocking(0)`は `s.settimeout(0)`と、`s.setblocking(1)`は `s.settimeout(None)`とそれぞれ同じ意味を持ちます。

`settimeout`( | value)

  ソケットのブロッキング処理のタイムアウト値を指定します。valueに は、正の浮動小数点で秒数を指定するか、もしくは`None`を指定します。 浮動小数点値を指定した場合、操作が完了する前にvalueで指定した秒数 が経過すると`timeout`が発生します。タイムアウト値に`None`を 指定すると、ソケットのタイムアウトを無効にします。 `s.settimeout(0.0)`は`s.setblocking(0)`と、 `s.settimeout(None)`は`s.setblocking(1)`とそれぞれ同じ意味を持 ちます。 バージョン2.3 以降で新規追加された 仕様です。

`gettimeout`( | )

  ソケットに指定されたタイムアウト値を取得します。タイムアウト値が設定され ている場合には浮動小数点型で秒数が、設定されていなければ`None`が返 ります。この値は、最後に呼び出された`setblocking()`または `settimeout()`によって設定されます。 バージョン2.3 以降で新規追加された 仕様です。

ソケットのブロッキングとタイムアウトについて:ソケットオブジェクトのモー ドは、ブロッキング・非ブロッキング・タイムアウトの何れかとなります。初期 状態では常にブロッキングモードです。ブロッキングモードでは、処理が完了す るまでブロックされます。非ブロッキングモードでは、処理を行う事ができなけ れば(不幸にもシステムによって異なる値の)エラーとなります。タイムアウト モードでは、ソケットに指定したタイムアウトまでに完了しなければ処理は失敗 となります。`setblocking()`メソッドは、`settimeout()`の省 略形式です。

内部的には、タイムアウトモードではソケットを非ブロッキングモードに設定し ます。ブロッキングとタイムアウトの設定は、ソケットと同じネットワーク端点 へ接続するファイルディスクリプタにも反映されます。この結果、 `makefile()`で作成したファイルオブジェクトはブロッキングモードで のみ使用することができます。これは非ブロッキングモードとタイムアウトモー ドでは、即座に完了しないファイル操作はエラーとなるためです。

`setsockopt`( | level, optname, value)

  ソケットのオプションを設定します(Unixのマニュアルページ setsockopt(2)を参照)。`SO_*`等のシンボルは、このモジ ュールで定義しています。`value`には、整数または文字列をバッファとし て指定する事ができます。文字列を指定する場合、文字列には適切なビットを設 定するようにします。(`struct` モジュール を利用すれば、Cの構造体を文字列にエンコードする事ができます。)

`shutdown`( | how)

  接続の片方向、または両方向を切断します。howが`0`の場合、以降 は受信を行えません。howが`1`の場合、以降は送信を行えません。 howが`2`の場合、以降は送受信を行えません。

`read()`メソッドと`write()`メソッドは存在しませんので注意 してください。代わりにflagsを省略した`recv()`と `send()`を使うことができます。