web-dev-qa-db-ja.com

PHPソケットとストリーム

Phpソケットとphpストリームが重なっていると思います。
ソケットまたはストリームのいずれかを使用して、CLI PHPチャットクライアントとサーバーを作成することができました。

ここにいくつかの図解コード行があります:
ソケットの使用:

...
$main_socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Cannot create socket.\n");
@socket_bind($main_socket, $Host, $port) or die("Could not bind to socket $Host : $port.\n");
@socket_listen($main_socket, 5) or die("Could not set up socket listener\n");
...

ストリームの使用:

...
$main_socket = @stream_socket_server ("tcp://$Host:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN) or die("Cannot create socket.\n");
$clients = array($main_socket);
$clients_peername = array(array('port' => $port));

fputs(STDOUT, "Waiting for connections...\n");
...

ここでのポイントは、クライアントとサーバーは、いずれかのソケット関数、どちらのストリーム関数を使用して作成できるということです。

StreamsがPHPコアの一部であり、Socketsが拡張機能であることを知っています。

私の質問は次のとおりです。

  • ソケットプログラミングを参照する場合、ソケットとストリームの違いは何ですか?
  • ソケットプログラミングに関連して、一方が持つことができ、もう一方ができない機能はありますか?
25
Catalin Enache

マニュアルによると、ソケット拡張はより低レベルです。たとえば、ソケットを作成するときにきめ細かい制御が可能であり、SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKETなどを選択できます。

ソケット拡張は、一般的なBSDソケットに基づくソケット通信機能への低レベルのインターフェースを実装し、クライアントとしてだけでなくソケットサーバーとしても機能する可能性を提供します。

より一般的なクライアント側ソケットインターフェイスについては、stream_socket_client()、stream_socket_server()、fsockopen()、およびpfsockopen()を参照してください。

ソース: http://www.php.net/manual/en/intro.sockets.php

15
serans

ご指摘のとおり、「ストリーム」はPHPコア(組み込み、常に利用可能)にありますが、「ソケット」はめったに含まれない拡張機能の一部です。それ以外はほぼ同じです。 TCPとUDPの両方を、すべてのユースケースの99%をカバーするブロッキングモードと非ブロッキングモードの両方のストリームで使用できます。

私が考えることができる唯一の一般的な例外はICMPです。たとえば、「ping」。ただし、現在、PHPからICMPを実行する安全な方法はないようです。このような呼び出しには、ソケット拡張を介したSOCK_RAWが必要です。これを実行するには、「root」権限が必要です。また、すべてのルーターがTCP、UDP、およびICMPの外部で他のパケットタイプをルーティングするわけではありません。これにより、ソケット拡張の有用性が制限されます。

7
CubicleSoft