请求包头是:
typedef struct _WEB_MESSAGE_HEADER
{
uint8_t Magic[4];//四个字母
uint8_t Version;//整数
uint8_t Reserved;
uint8_t Command;//16进制
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
} 响应包头是:
typedef struct _WEB_MESSAGE_HEADER
{
uint8_t Magic[4];
uint8_t Version;
uint8_t Reserved;
uint8_t Command;
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
}
包体是:
typedef struct _WEB_DEVICE_ACK
{
uint8_t Magic[4];
uint8_t Version;
uint8_t ClientCount;//整数
uint8_t Command;
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
char Name[128];
}我该如何用php(client)与这个C程序(server)通信?
typedef struct _WEB_MESSAGE_HEADER
{
uint8_t Magic[4];//四个字母
uint8_t Version;//整数
uint8_t Reserved;
uint8_t Command;//16进制
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
} 响应包头是:
typedef struct _WEB_MESSAGE_HEADER
{
uint8_t Magic[4];
uint8_t Version;
uint8_t Reserved;
uint8_t Command;
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
}
包体是:
typedef struct _WEB_DEVICE_ACK
{
uint8_t Magic[4];
uint8_t Version;
uint8_t ClientCount;//整数
uint8_t Command;
uint8_t ClientOS;
uint32_t Status;
uint32_t Length;
char Name[128];
}我该如何用php(client)与这个C程序(server)通信?
<?php
//比如我现在要打包请求包,你看一下是这样吗?
$bin=pack('C4CCHCLL',65,66,67,68,2,1,0x00,1,0x00,13);
?>然后,看到你之前的那个帖子的回复。$d = unpack('A4Magic/CVersion/CCommand/CClientOS/lStatus/lLength', $str);
$d['Magic'] = unpack('C*', $d['Magic']);print_r($d);
一开始幻数的时候,用A4和C4有什么区别吗?C程序发送的包,四字节对齐。
C是一个无符号字符吧?
那么,Version/ClientOS的时候,都是8位的无符号整数。那么...用C就可以了?
Command是一个16进制的,8位无符号整数。用C就行,不用H吗?
最后,就是Status和Length,应该用L(无符号32位整数吧?)
再就是unpack的时候,可不可以分段...
比如,我先unpack一部分,然后根据unpack出来的内容,再继续unpack?初学,不是太明白谢谢大神了
{
uint8_t Magic[4];//四个字母 CCCC
uint8_t Version;//整数 C
uint8_t Reserved; C
uint8_t Command;//16进制 H or C
uint8_t ClientOS; C
uint32_t Status; L
uint32_t Length; L
}
所以
$bin=pack('C4CCHCLL',65,66,67,68,2,1,'00',1,0x00,13);
或
$bin=pack('C4CCCCLL',65,66,67,68,2,1,0x00,1,0x00,13);
你可以用 substr 函数截取一部分进行转换,只是你需要知道你在做什么就可以了
然后...这个C程序,和php用UDP通信。
比如,从php传送请求包到C,是这样吗?$serverip = '127.0.0.1';
$port = 8000;
//create UDP socket
if(($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) < 0){
print("Couldn't create socket: " .
socket_strerror(socket_last_error()) . "\n");
}
if(!socket_connect($socket, $serverip, $port)){
print("Couldn't connect: " .
socket_strerror(socket_last_error()) . "\n");
}
$packstr='C4CCCCLL';
$bin=pack($packstr,65,66,67,68,2,1,0x00,1,0x00,13);
socket_write($socket,$bin);
socket_write和socket_send有什么区别还有就是
socket_read和socket_recv有什么区别...?
socket_read和socket_recv依然