今日、PHP と C 言語の間でソケットを介して通信するプログラムを作成しようとしました。PHP のマニュアルを読んだところ、ソケット クライアントを確立する方法がいくつかあることがわかりました。 fsockopen() を介して接続し、 fputs() を使用してメッセージを送信し、 fgets() を使用してメッセージを受信します。
2.socket_create() を通じてソケット接続を確立し、socket_send() またはソケット_write() を使用してメッセージを送信し、socket_recv() またはソケット_read() を使用してメッセージを送信します。
非常に奇妙ですが、マニュアルに次の段落がありました。「この拡張モジュールは実験的なものです。関数の名前を含むこのモジュールの動作や、このモジュールに関するその他のドキュメントは、予告なく変更される可能性があります。 PHP の今後のリリースでは変更される可能性があります。この拡張モジュールは自己責任で使用してください。「php4.0 ソケット通信はまだ完全に安定していないようです。
今日、私が作成したクライアントはサーバーと 2 回通信する必要があります。上記の方法を使用してクライアント プログラムを作成したところ、通信が 1 回しかない場合、PHP クライアントはメッセージを 1 回送信したことがわかりました。その後、返信メッセージを受信して接続を閉じます。どちらの方法でも関数を正しく迅速に実装できますが、最初の方法での最初の通信はすぐに終了しますが、2 回目の通信には数分かかりました。何度か試しましたが、プログラムの何が問題だったのか、接続に問題があったのかわかりません。しかし、2 番目の方法では、これら 2 つの通信を迅速に完了できませんでした。 !とてもよくできました。
最後に 2 番目の状況に基づいてクラスを作成しました
/////////////////////////// / // ファイルの説明 ///////////////////////////////////////////
// クラス名 : ソケット// バージョン : V1.0
// 機能概要 : ソケットを作成し、サーバーにメッセージを送信
// 改訂履歴 : 2004/12/15 初版作成
// 現在 : 2004/12/15 劉永生
///////////////////////////////// // /////////////////////////////////////////////// ////// /////
クラス ソケット{
var $socket; //ソケット ハンドル
var $sendflag = ">>>";
var $recvflag = "<< <";
var $response;
var $debug = 1;
functionソケット($hostname,$port){
$address = gethostbyname($hostname) ;
$this ->socket =socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$result =ソケット_connect($this->socket,$address,$port);
if($this- >debug == 1 ){
if ($result echo "socket_connect() failed.nReason: ($result) " .socket_strerror($result) . ;
} else {
echo "接続 OK。
";
}
}
}
function sendmsg($msg){
ソケット_write($this ->socket,$ msg,strlen($msg));
$result =socket_read($this->socket,100);
$this->response = $result;
if ($this-> debug == 1){
printf("%s $msg
",$this->sendflag);
printf("
}