`
alfred_long
  • 浏览: 559591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP socket 发送数据流与c++通信

    博客分类:
  • PHP
阅读更多

在某次项目中需要与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 一个空结束的(和空填充的)字节串

@ 用空字节填充绝对位置

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics