设为首页 收藏本站
查看: 712|回复: 0

[经验分享] PHP socket 发送数据流与c++通信

[复制链接]

尚未签到

发表于 2017-4-10 09:30:22 | 显示全部楼层 |阅读模式
  在某次项目中需要与c++的接口进行socket通信,数据的发送与接收都是数据流,需要将发送的数据转化为数据流,再通过socket发送到对应的端口。
  要点:
  1对应的数据包结构(C++与PHP一致)
  2 pack函数使用
  3 pack函数format参数(第一个参数的正确使用),要跟c++发送的数据及C type 一致
  4 format 中在每个format 对应后面 每一个参数,要在后面跟长度例:$data = pack('A5C','melon',1)
  5 unpack 函数中的format 对应多个函数,用“/”分隔 例:用上面的$data ,unpack("A5mystr/Cmyint",$data),输出array('mystr'=>'melon','myint'=>1)
  例 数据包结构 为:数据包头(2Byte) 包含数据大小, 数据内容,’\0’结尾的字符串

<?php
$host='127.0.0.1;
$port= 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
if(!$socket){  
exit('创建socket失败');  
}  
$result = socket_connect($socket,$host,$port);
$message = "recharge";
$mlength = strlen($message);
$length = strlen($message) + 3;
$fmt_data = pack("sA".$mlength."C", $length, $message, 0);
var_dump(strval($fmt_data));
$result=socket_write($socket,$fmt_data);
if(!$result){  
exit('发送信息失败');
}
$out = socket_read($socket,128);
$recvmessage = strlen($out)-3;
$ufmt_data = unpack("slenth/A".$recvmessage."meg/Cend",$out);
var_dump($ufmt_data);
socket_close($socket);
  附:
  format参数中文说明:
  pack/unpack 的摸板字符字符 含义
  a 一个填充空的字节串
  A 一个填充空格的字节串
  b 一个位串,在每个字节里位的顺序都是升序
  B 一个位串,在每个字节里位的顺序都是降序
  c 一个有符号 char(8位整数)值
  C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
  d 本机格式的双精度浮点数
  f 本机格式的单精度浮点数
  h 一个十六进制串,低四位在前
  H 一个十六进制串,高四位在前
  i 一个有符号整数值,本机格式
  I 一个无符号整数值,本机格式
  l 一个有符号长整形,总是 32 位
  L 一个无符号长整形,总是 32 位
  n 一个 16位短整形,“网络”字节序(大头在前)
  N 一个 32 位短整形,“网络”字节序(大头在前)
  p 一个指向空结尾的字串的指针
  P 一个指向定长字串的指针
  q 一个有符号四倍(64位整数)值
  Q 一个无符号四倍(64位整数)值
  s 一个有符号短整数值,总是 16 位
  S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
  u 一个无编码的字串
  U 一个 Unicode 字符数字
  v 一个“VAX”字节序(小头在前)的 16 位短整数
  V 一个“VAX”字节序(小头在前)的 32 位短整数
  w 一个 BER 压缩的整数
  x 一个空字节(向前忽略一个字节)
  X 备份一个字节
  Z 一个空结束的(和空填充的)字节串
  @ 用空字节填充绝对位置

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362719-1-1.html 上篇帖子: php面向对象中static 关键字的使用 下篇帖子: php > 根据远程图片URL 生成缩略图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表