时间:2021-07-01 10:21:17 帮助过:6人阅读
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 将收取到的所有数据都做个日志方便调试.先确认是否没有收到信息
求不沉,大神们给些建议
php 与 C++ 的json encode是不同的,这里要处理一下。
既然你认为是服务器端没有返回,那么似乎应该贴出你的C++服务器端的代码。
php 与 C++ 的json encode是不同的,这里要处理一下。
  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 是不能作为循环终止的条件的  
 比如 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";   
 看看能输出什么  
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;    那不就是 如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入 的情况了  
 这说明服务端没有发送结束符(也就是没有遵守约定)  
 你也只能连接 socket_read($socket,1) 的结果了  
 其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)