请求包头是:
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)通信?

解决方案 »

  1.   

    你不是问过的吗? http://topic.csdn.net/u/20120827/12/6cfbf361-c67a-4c5d-8f32-dd471d915247.html
      

  2.   


    <?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?初学,不是太明白谢谢大神了
      

  3.   

    typedef struct _WEB_MESSAGE_HEADER
    {
        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);
      

  4.   

    unpack的时候,可以分段
    你可以用 substr 函数截取一部分进行转换,只是你需要知道你在做什么就可以了
      

  5.   


    然后...这个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有什么区别...?
      

  6.   

    相对 socket_write 而言 socket_send 更底层一点,可控的细节也多一点
    socket_read和socket_recv依然
      

  7.   

    所以,如果只是常规的操作,write就够用了吧?