socket通信 php作为客户端,C++作为服务端通信问题。
最近想做一个如题这样的东西,现在php发送能成功,C++做出正确的相应:发送一段json字符串,但是C++发出的消息php怎么也收不到。。。不知道这是为什么。。请大家帮帮忙 难道是C++传给php的消息格式有什么问题?重点问题我感觉出在socket_read上。。但是没搞明白
<?phperror_reporting(E_ALL);set_time_limit(0);echo "<h2 id="TCP-IP-nbsp-Connection">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 encode是不同的,这里要处理一下。
php 将收取到的所有数据都做个日志方便调试.先确认是否没有收到信息
求不沉,大神们给些建议
我还没有做json的解析,现在只是想把json串整个弄下来,但是也出不来。。。
php 与 C++ 的json encode是不同的,这里要处理一下。
$out = socket_read($socket,8192) 我要是将这句8192改成1的话就能读出9个字符,但是读不全。。。
既然你认为是服务器端没有返回,那么似乎应该贴出你的C++服务器端的代码。
php 与 C++ 的json encode是不同的,这里要处理一下。
找到了socket_read 的错误,但是没有错误提示。。。。有没有和socket_read功能类似的函数?socket_recv我也试过。。不行
while( ($out = socket_read($socket,8192))!== false){
}
这里先去掉因为读到空格字符的因素
while(true) {
$out = socket_read($socket,8192);
socket_read 会返回收到的任何数据,包括空串
因此你不要不断的去读,而不是读一次就结束
当然由于循环变成了死循环后,你需要做一个跳出循环的约定
while( ($out = socket_read($socket,8192))!== false){
}
这里先去掉因为读到空格字符的因素
while(true) {
$out = socket_read($socket,8192);
socket_read 会返回收到的任何数据,包括空串
因此你不要不断的去读,而不是读一次就结束
当然由于循环变成了死循环后,你需要做一个跳出循环的约定
恩,我作了跳出循环的约定,就是要把socket_read($socket,8192)改成socket_read($socket,1)才能读,而且读的支离破碎,请这到底是为什么。。。。
你没有明白我的意思!
socket_read 是不能作为循环终止的条件的
比如 while(socket_read($socket,1)),一旦读到 php 认为是“空”的字符(empty 返回真的那些字符)时就会终止循环,造成数据不全
而 while(socket_read($socket,8192)) 时,如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入的情况下
当然也有可能一开始就读到上一轮剩余的空字符,而根本进不了循环体
既然你在循环结束后有 echo "关闭SOCKET...\n";
不妨改作 echo "$out 关闭SOCKET...\n";
看看能输出什么
你没有明白我的意思!
socket_read 是不能作为循环终止的条件的
比如 while(socket_read($socket,1)),一旦读到 php 认为是“空”的字符(empty 返回真的那些字符)时就会终止循环,造成数据不全
而 while(socket_read($socket,8192)) 时,如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入的情况下
当然也有可能一开始就读到上一轮剩余的空字符,而根本进不了循环体
既然你在循环结束后有 echo "关闭SOCKET...\n";
不妨改作 echo "$out 关闭SOCKET...\n";
看看能输出什么
我明白你的意思,我把代码改成了这样,但是就像我说的,只有$out=socket_read($socket,1);才行,如果$out=socket_read($socket,8192)就是死循环,一直等待,什么都输出不了。。即使之前的那些输出信息也是输出不了的
do { $out=socket_read($socket,1); $data.=$out;}while(true);echo $data;
do { $out=socket_read($socket,8192); if($out=="E") break; $data.=$out;}while(true);echo $data;
刚才代码粘错了,应该是这样的,我在服务端加了一个字符串最后加了字母E
那不就是 如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入 的情况了
这说明服务端没有发送结束符(也就是没有遵守约定)
你也只能连接 socket_read($socket,1) 的结果了
其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Les longues URL, souvent encombrées de mots clés et de paramètres de suivi, peuvent dissuader les visiteurs. Un script de raccourcissement d'URL offre une solution, créant des liens concis idéaux pour les médias sociaux et d'autres plateformes. Ces scripts sont utiles pour les sites Web individuels

À la suite de son acquisition de haut niveau par Facebook en 2012, Instagram a adopté deux ensembles d'API pour une utilisation tierce. Ce sont l'API graphique Instagram et l'API d'affichage de base Instagram. En tant que développeur créant une application qui nécessite des informations à partir d'un

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Il s'agit de la deuxième et dernière partie de la série sur la construction d'une application React avec un back-end Laravel. Dans la première partie de la série, nous avons créé une API RESTful utilisant Laravel pour une application de liste de base sur le produit. Dans ce tutoriel, nous serons Dev

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

L'enquête sur le paysage PHP 2025 étudie les tendances actuelles de développement du PHP. Il explore l'utilisation du cadre, les méthodes de déploiement et les défis, visant à fournir des informations aux développeurs et aux entreprises. L'enquête prévoit la croissance de la PHP moderne versio
