socket通信php作为客户端,C++作为服务端通信问题。
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了socket通信php作为客户端,C++作为服务端通信问题。,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3936字,纯文字阅读大概需要6分钟。
内容图文
![socket通信php作为客户端,C++作为服务端通信问题。](/upload/InfoBanner/zyjiaocheng/203/ecbe4b1cfeba445098e96aa9f0649d03.jpg)
TCP/IP Connection\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 "发送的内容为:$in
"; }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) 的结果了
其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)
内容总结
以上是互联网集市为您收集整理的socket通信php作为客户端,C++作为服务端通信问题。全部内容,希望文章能够帮你解决socket通信php作为客户端,C++作为服务端通信问题。所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。