ソケット通信: PHP はクライアントとして機能し、C++ はサーバー通信の問題として機能します。

WBOY
リリース: 2016-06-23 13:38:46
オリジナル
885 人が閲覧しました

最近、タイトルのようなことをしたいと思っていました。これで、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) 的结果了
其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート