socket_recv
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
socket_recv — 接続したソケットからデータを受信する
説明
socket_recv
( resource $socket
, string &$buf
, int $len
, int $flags
) : int
socket_recv() 関数は、
socket
から
len
バイトのデータを受信して
buf
に格納します。
socket_recv() を使うと、
接続したソケットからデータを収集することができます。
さらに、フラグを指定して関数の挙動を変更することもできます。
buf
は参照渡しなので、
引数リストには変数で渡さなければなりません。
socket
から socket_recv()
で読み込んだデータが buf
に入ります。
パラメータ
socket
socket
は、事前に socket_create() で作成したソケットリソースでなければなりません。buf
受信したデータが、
buf
で指定した変数に格納されます。 エラーが発生したり接続がリセットされたりデータが存在しなかったりした場合は、buf
にはnull
が設定されます。len
最大
len
バイトまでをリモートホストから取得します。flags
flags
の値は、次のフラグを論理 OR (|
) 演算子で組み合わせたものとなります。flags
のとりうる値フラグ 説明 MSG_OOB
out-of-band を処理します。 MSG_PEEK
受信キューの先頭からデータを取得し、受信したデータをキューから削除しません。 MSG_WAITALL
最低 len
バイト受信するまでブロックします。しかし、シグナルを受け取ったりリモートホストが接続を切断したりした場合は、 この関数が返すデータがそれより少なくなる可能性があります。
MSG_DONTWAIT
このフラグを設定すると、正常にブロックされている状態でも関数が結果を返します。
返り値
socket_recv() は、受信したバイト数を返します。
エラーが発生した場合は false
を返します。
実際のエラーコードを取得するには
socket_last_error() をコールします。
このエラーコードを socket_strerror()
に渡すと、エラーに関する説明テキストを取得することができます。
例
例1 socket_recv() の例
この例は、 例 の最初の例を書き換えて socket_recv() を使う形式にしたものです。
<?phperror_reporting(E_ALL);echo "<h2>TCP/IP Connection</h2>\n";/* WWW サービスのポートを取得します */$service_port = getservbyname('www', 'tcp');/* 対象となるホストの IP アドレスを取得します */$address = gethostbyname('www.example.com');/* TCP/IP ソケットを作成します */$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";} else { echo "OK.\n";}echo "Attempting to connect to '$address' on port '$service_port'...";$result = socket_connect($socket, $address, $service_port);if ($result === false) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";} else { echo "OK.\n";}$in = "HEAD / HTTP/1.1\r\n";$in .= "Host: www.example.com\r\n";$in .= "Connection: Close\r\n\r\n";$out = ;echo "Sending HTTP HEAD request...";socket_write($socket, $in, strlen($in));echo "OK.\n";echo "Reading response:\n\n";$buf = 'This is my buffer.';if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) { echo "Read $bytes bytes from socket_recv(). Closing socket...";} else { echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";}socket_close($socket);echo $buf . "\n";echo "OK.\n\n";?>
上の例の出力は、このようになります。
<h2>TCP/IP Connection</h2> OK. Attempting to connect to '208.77.188.166' on port '80'...OK. Sending HTTP HEAD request...OK. Reading response: Read 123 bytes from socket_recv(). Closing socket...HTTP/1.1 200 OK Date: Mon, 14 Sep 2009 08:56:36 GMT Server: Apache/2.2.3 (Red Hat) Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT ETag: "b80f4-1b6-80bfd280" Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8 OK.