2012-03-18 8 views
18

PHPソケットとPHPストリームが重なっていると思います。
私は、CLIのPHPチャットクライアントとサーバーを、ソケットまたはストリームのいずれかを使用して作成しました。ここ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コアの一部であり、ソケットは拡張機能です。

私の質問(複数可)である(ある):

  • ソケットとソケットプログラミングを参照するときにストリームの違いは何ですか?
  • ソケットプログラミングに関連する機能はありますか?他の機能は実行できません。
+0

@JamWaffles編集していただきありがとうございました。 –

+0

問題ありません。あなたの英語はほぼ完璧なので、心配することはありません:) – Bojangles

答えて

9

マニュアルによれば、ソケットの拡張子は、より低レベルです。たとえば、あなたが1を作成するときに、きめ細かな制御を持っており、SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKETを選択することができ、ソケットなど

whithソケット拡張モジュールは、人気に基づくソケット通信に関する低レベルインターフェースを実装しますBSDソケットであり、クライアントと同様にソケットサーバーとして動作する可能性があります。

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

ソース:あなたが指摘したようにhttp://www.php.net/manual/en/intro.sockets.php

+1

*もっと低レベル*の方が速いのですか? – Pacerier

+0

必ずしも、あなたが何が起こっているのかをもっとコントロールできるということです。あなたは、場合によっては速度を向上させるために、より細かいコントロールを使用するかもしれません。 – serans

4

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

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

関連する問題