stream_socket_client
インターネットドメインまたは Unix ドメインのソケット接続を開く
説明
resourcefalse stream_socket_client(
string $address
,
int &$error_code
= null
,
string &$error_message
= null
,
floatnull $timeout
= null
,
int $flags
= STREAM_CLIENT_CONNECT
,
resourcenull $context
= null
)
注意:
ストリームはデフォルトではブロックモードで開かれますが、
stream_set_blocking を使うことで非ブロックモードに
変更することができます。
パラメータ
-
address
-
接続するソケットのアドレス。
-
error_code
-
接続に失敗した場合にシステムレベルのエラー番号が設定されます。
-
error_message
-
接続に失敗した場合にシステムレベルのエラーメッセージが設定されます。
-
timeout
-
connect()
システムコールがタイムアウトとなるまでの秒数。
デフォルトでは、
default_socket_timeout
の値を使います。
注意:
このパラメータが適用されるのは、非同期通信を試みていない場合のみです。
注意:
ソケット上のデータの読み書きに関してタイムアウトを設定する必要がある場合は、
stream_set_timeout を使ってください。
stream_socket_client に渡される
timeout
は、ソケットの接続時にのみ適用されます。
-
flags
-
接続設定フラグの任意の組み合わせを指定できるビットフィールドです。
現在、接続設定フラグとして選択できる値は、
STREAM_CLIENT_CONNECT
(デフォルト)、
STREAM_CLIENT_ASYNC_CONNECT
と
STREAM_CLIENT_PERSISTENT
のみです。
-
context
-
stream_context_create で作成した有効なコンテキストリソース。
戻り値
成功した場合に、
fgets, fgetss,
fwrite, fclose,
feof といった、ファイル関数と共に使うことのできるストリームリソースを返します。
エラー / 例外
失敗した場合は、error_code
と
error_message
に
システムレベルの connect()
関数の実行時に発生したシステムレベルのエラーを表す値を返します。
もし、error_code
に返された値が 0
で、かつ、 この関数が false
を返した時は、
connect()
システムコールの前に何らかのエラーが
発生したことを示しています。これは、多くの場合、ソケットの初期化
に失敗したことで起こります。error_code
と
error_message
パラメータは常に参照渡しされることに
留意してください。
例
例1 stream_socket_client の例
<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
例2 UDP 接続の使用
ローカルホスト上で動いている
UDP サービスの "daytime" (ポート 13) で日時の情報を取得します。
<?php
$fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>
注意
警告
UDP ソケットは、リモートホストに到達できなくても
エラーを発生せず、開いているかような状態になることがありす。
このエラーは、実際にソケットに対して、読み込みや書き込み動作を
行ってみないと判断できません。原因としては、UDP が非接続型の
プロトコルであることが挙げられます。つまり、実際にデータを
送受信する段階になるまで、OS の側では接続を確立しようとしないという
ことです。
注意: 数値で IPv6 アドレスを指定するときは、
(例 fe80::1
) アドレスを角カッコでくくらなくてはなりません。たとえば、
tcp://[fe80::1]:80
.
注意:
環境により、Unix ドメインや接続タイムアウトが利用できない場合があります。
有効なトランスポートのリストは、stream_get_transports
で取得できます。組み込むのポートの一覧については、
サポートされるソケットトランスポートのリスト を参照ください。
参考
- stream_socket_server
- stream_set_blocking
- stream_set_timeout
- stream_select
- fgets
- fgetss
- fwrite
- fclose
- feof
- cURL 関数