最近、タイトルのようなことをしたいと思っていました。これで、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 は受信したすべてのデータのログを作成します
遠慮しないでください、神はいくつかの提案を与えることができます
phpとC++のjsonエンコーディングが異なるため、ここで対処する必要があります。
サーバー側が戻っていないと思われるので、C++ サーバー側のコードを投稿する必要があるようです。
phpとC++のjsonエンコーディングが異なるため、ここで対処する必要があります。
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 をループ終了の条件として使用することはできません
たとえば、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;
那不就是 如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入 的情况了
这说明服务端没有发送结束符(也就是没有遵守约定)
你也只能连接 socket_read($socket,1) 的结果了
其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)