(PHP 4 >= 4.1.0, PHP 5)
socket_recv — 接続したソケットからデータを受信する
$socket
, string &$buf
, int $len
, int $flags
)
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
(|) 演算子で組み合わせたものとなります。
フラグ | 説明 |
---|---|
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() を使う形式にしたものです。
<?php
error_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.