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  \r\n",sum);
103     for(i=0;i<sum;i++)
104     {
105         printf("%.2X ",(unsigned char)(des[i]));
106     }
107 
108     return 0;
109 }

 

转载于:https://www.cnblogs.com/Esperanto/p/4959229.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值