zoukankan      html  css  js  c++  java
  • websocket 传输数据帧打包 (client端)

      1 /*
      2 Vertion: 0.2.1
      3 date:    2015.8.11
      4 content: gcc 编译通过
      5 */
      6 
      7 //websocket 传输数据帧打包  client端
      8 //参数:src 为输入字符串  
      9 //      len为输入字串src长度   
     10 //      mask为4个字节掩码值
     11 //      des 为输出掩码后字节数组。
     12 //      sum 为输出des实际长度 (len+6: len<=125
     13 //                             len+8: 125<len<=65535
     14 //                             len+10: len>65535
     15 //                             0: 组帧失败)
     16 void maskpak(unsigned char src[],
     17          unsigned int len,
     18          unsigned char mask[],
     19          unsigned char des[],
     20          unsigned int *sum)
     21 {
     22     unsigned char FIN    =0X80;
     23     unsigned char RSV1   =0X00;
     24     unsigned char RSV2   =0X00;
     25     unsigned char RSV3   =0X00;
     26     unsigned char OPCODE =0X01; //文本帧
     27     unsigned char MASK   =0X80; //掩码标识
     28     unsigned char PLEN   =0X00;
     29 
     30     int index=0;
     31     int i; 
     32  
     33         des[index++]= FIN +RSV1 +RSV2 +RSV3 +OPCODE;
     34 
     35     if(len<=125)
     36     {
     37         PLEN =len;
     38     }else if(len<=0XFFFF)
     39     {
     40         PLEN =126;
     41     }else
     42     {
     43         PLEN =127;
     44     }
     45     des[index++]= MASK +PLEN;
     46     
     47     //网络字节序标准为: 大端方式(即高字节在前低字节在后)
     48     if(PLEN<=125)
     49     {
     50         *sum= len+6;
     51     }
     52     else if(126==PLEN)
     53     {
     54         unsigned short temp;
     55         temp =len;
     56         des[index++] =(unsigned char)(temp>>8);
     57         des[index++] =(unsigned char)temp;
     58         *sum= len+8;
     59     }else if(127==PLEN)
     60     {
     61         unsigned int temp;
     62         temp =len;
     63         des[index++] =(unsigned char)(temp>>24);
     64         des[index++] =(unsigned char)(temp>>16);
     65         des[index++] =(unsigned char)(temp>>8);
     66         des[index++] =(unsigned char)temp;
     67         *sum=len+10;
     68     }else
     69     {
     70         *sum= 0;
     71         return;
     72     }
     73     
     74     for(i=0;i<4;i++)
     75     {
     76         des[index++] =mask[i];
     77     }
     78     
     79     for(i=0;i<len;i++)
     80     {
     81         des[index++] =src[i]^mask[i%4];
     82     }
     83 }
     84 
     85 // 测试代码
     86 int main(int argc,char *argv)
     87 {
     88     unsigned char src[200];
     89     unsigned char mask[4]= {0X00,0X00,0X00,0X00};
     90     unsigned char des[200+8];
     91     unsigned int len = 200;
     92     unsigned int sum;
     93 
     94     int i;
     95 
     96     for (i=0;i<200;i++)
     97     {
     98         src[i] = i;
     99     }
    100     maskpak(src,len,mask,des,&sum);
    101 
    102     printf("SUM=%d  
    ",sum);
    103     for(i=0;i<sum;i++)
    104     {
    105         printf("%.2X ",(unsigned char)(des[i]));
    106     }
    107 
    108     return 0;
    109 }
  • 相关阅读:
    [BAT] 通过批处理删除7天前的报告,并删除当前目录下的空文件夹
    Codeforces Round #361 (Div. 2) A
    Codeforces Round #359 (Div. 2) C
    Codeforces Round #359 (Div. 2) B
    Codeforces Round #359 (Div. 2) A
    Codeforces Round #357 (Div. 2) C
    Codeforces Round #357 (Div. 2) B
    Codeforces Round #357 (Div. 2) A
    Codeforces Round #356 (Div. 2) C
    Codeforces Round #356 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/Esperanto/p/4959229.html
Copyright © 2011-2022 走看看