ソケット通信: PHP はクライアントとして機能し、C++ はサーバー通信の問題として機能します。
最近、タイトルのようなことをしたいと思っていました。これで、PHP は正常に送信でき、C++ は正しく応答し、json 文字列を送信しましたが、PHP は C++ によって送信されたメッセージを受信できません。 。 。理由はわかりません。 。 C++からphpに送信されるメッセージ形式に問題があるのでしょうか?重要な問題はsocket_readにあると感じます。 。しかし、私は理解できません
<?phperror_reporting(E_ALL);set_time_limit(0);echo "<h2>TCP/IP Connection</h2>\n";$port = 6000;$ip = "127.0.0.1";$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";}else { echo "OK.\n";}echo "试图连接 '$ip' 端口 '$port'...\n";$result = socket_connect($socket, $ip, $port);if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";}else { echo "连接OK\n";}$in = 'r';$out =''; if(!socket_write($socket,$in,strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; }while($out = socket_read($socket,8192)) { //echo "接收服务器回传信息成功!\n"; //$obj=json_decode($out); //echo "接受的内容为:",$out; echo $out; //echo $obj->0;}/*if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) { echo 'aa'.$buf.'aa'; echo "Read $bytes bytes from socket_recv(). Closing socket...";} else { echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . " ";}*/echo "关闭SOCKET...\n";socket_close($socket);echo "关闭OK\n";?>
ディスカッションに返信 (解決策)
遠慮しないでください、マスターがいくつかの提案をすることができます
php と C++ の json エンコーディングは異なります。ここで対処されます。
デバッグを容易にするために、php は受信したすべてのデータのログを作成します
遠慮しないでください、神はいくつかの提案を与えることができます
私はまだ json 分析を行っていません。今はjsonしたいだけです 串全体を取り出そうとしましたが、抜けませんでした。 。 。
phpとC++のjsonエンコーディングが異なるため、ここで対処する必要があります。
$out =ソケット_read($socket,8192) この文8192を1に変更すると、9文字は読めますが、全部は読めません。 。 。
サーバー側が戻っていないと思われるので、C++ サーバー側のコードを投稿する必要があるようです。
phpとC++のjsonエンコーディングが異なるため、ここで対処する必要があります。
socket_read エラーが見つかりましたが、エラー メッセージはありません。 。 。 。 socket_readに似た関数はありますか?私もsocket_recvを試してみました。 。いいえ
while( ($out =socket_read($socket,8192))!== false){
}
ここで、まずスペース文字の読み取り要素を削除します
while(true) {
$out =ソケット_read($ソケット,8192);
socket_read は空の文字列を含む受信したデータを返します
したがって、一度読み取って終了するのではなく、連続的に読み込むべきではありません
もちろん、ループは無限ループになるため、ループから抜け出すための合意
while( ($out =socket_read($socket,8192))!== false){
}
ここで、まずスペース文字の読み取り要因を削除します
while( true) {
$out =ソケット_read($socket,8192);
ソケット読み取りは、空の文字列を含む、受信したデータを返します
したがって、一度読み取って終了するのではなく、読み続ける必要はありません
もちろん、ループが死んでしまう ループの後は、ループから抜け出す約束をする必要があります
さて、ループから抜け出す約束をしました。それは、socket_read($socket,8192)をsocket_read($に変更することです)読み取り前にソケット、1) を実行すると、読み取りが断片化される理由を教えてください。 。 。 。
私の言っている意味が分かりませんね!
socket_read をループ終了の条件として使用することはできません
たとえば、while(socket_read($socket,1)) は、php が「空」とみなす文字を読み取ると (空は true 文字を返します)、ループは次のようになります。ターミネータが受信されていない場合は、終了し、データが不完全になります
そして while(socket_read($socket,8192))
do { $out=socket_read($socket,8192); if($out=="E") break; $data.=$out;}while(true);echo $data;
刚才代码粘错了,应该是这样的,我在服务端加了一个字符串最后加了字母E
那不就是 如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入 的情况了
这说明服务端没有发送结束符(也就是没有遵守约定)
你也只能连接 socket_read($socket,1) 的结果了
其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
