stream_socket_server
(PHP 5, PHP 7)
stream_socket_server — インターネットドメインまたは Unix ドメインのサーバーソケットを作成する
説明
stream_socket_server
( string $local_socket
[, int &$errno
[, string &$errstr
[, int $flags
= STREAM_SERVER_BIND | STREAM_SERVER_LISTEN
[, resource $context
]]]] ) : resource
local_socket
で指定された接続ポイントに、
ストリームまたはデータグラムソケットによる接続を作成します。
この関数は、ソケットのみを作成します。接続待ちの状態に入るには、 stream_socket_accept() 関数を使います。
パラメータ
local_socket
作成されるソケットのタイプは、
[トランスポート]://[ターゲット]
という形式の URL フォーマットによって指定された トランスポートによって決定されます:TCP や UDP といったインターネットドメインのソケット (
AF_INET
) には、remote_socket
パラメータのターゲット
の部分は、ホスト名または IP アドレスと、 それに続くコロンで区切られたポート番号から構成されていなければなりません。 Unix ドメインのソケットの場合は、ターゲット
の部分は、ファイルシステムにおけるソケットのファイルを指定しなくては いけません。システムの種類によって、Unix ドメインのソケットが利用できない場合があります。 利用できるトランスポートの種類は、stream_get_transports() によって知ることができます。 組み込みのトランスポートのリストは、サポートされるソケットトランスポートのリスト を参照ください。
errno
オプションの
errno
とerrstr
パラメータが存在するときは、そこにシステムレベルのsocket()
、bind()
およびlisten()
のコールにおいて発生した 実際のシステムレベルのエラーを返します。 もし、errno
に返された値が0
で、かつfalse
が返された場合、bind()
コールを行う前にエラーが発生したことを示しており、これは多くの場合 ソケットの初期化に失敗したことを示しています。errno
とerrstr
パラメータは常に参照渡しとなることに留意してください。errstr
errno
の説明を参照ください。flags
ソケット作成フラグの任意の組み合わせを指定できるビットフィールドです。
注意:
UDP ソケットに対しては、
STREAM_SERVER_BIND
をflags
パラメータとして使用する必要があります。context
返り値
作成したストリーム、あるいはエラー時に false
を返します。
例
例1 TCP サーバーソケットの使用
<?php$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);if (!$socket) { echo "$errstr ($errno)<br />\n";} else { while ($conn = stream_socket_accept($socket)) { fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n"); fclose($conn); } fclose($socket);}?>
下記の例は、PHP のスクリプトが、どうやって stream_socket_client() で示したような、 問い合わせに応答するタイムサーバーとして機能するかを示したものです。
注意:
1024 番よりも小さいポート番号のサーバーソケットを作成する場合、 多くのシステムでは root 権限が必要となります。
例2 UDP サーバーソケットを利用する
<?php$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);if (!$socket) { die("$errstr ($errno)");}do { $pkt = stream_socket_recvfrom($socket, 1, 0, $peer); echo "$peer\n"; stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);} while ($pkt !== false);?>
注意
注意:
数値で IPv6 アドレスを指定するときは、(例
fe80::1
) アドレスを角カッコでくくらなくてはなりません。たとえば、tcp://[fe80::1]:80
.
参考
- stream_socket_client() - インターネットドメインまたは Unix ドメインのソケット接続を開く
- stream_set_blocking() - ストリームのブロックモードを有効にする / 解除する
- stream_set_timeout() - ストリームにタイムアウトを設定する
- fgets() - ファイルポインタから 1 行取得する
- fgetss() - ファイルポインタから 1 行取り出し、HTML タグを取り除く
- fwrite() - バイナリセーフなファイル書き込み処理
- fclose() - オープンされたファイルポインタをクローズする
- feof() - ファイルポインタがファイル終端に達しているかどうか調べる
- Curl 拡張モジュール