c语言TCP连接websocket服务端数据帧封装如何实现?

阶前梧叶 发布于 2014/11/21 09:02
阅读 7K+
收藏 0

服务端用的是java websocket api实现,客户端是用c语言实现,因为是做硬件产品,让硬件单片机采用websocket协议实现连接服务器上传数据,c的socket里实现http协议不难,构造http头就可以了,但是怎么去实现websocket呢?现在已经能够用c构造http升级到websocket协议,与服务端建立连接,但是发送数据却接收不到,是发送的数据数据帧构造的有问题。这里有一篇博客:http://jinnianshilongnian.iteye.com/blog/1899876  。讲的是websocket的数据帧封装。难点主要还在对于masking key的计算,还请懂的人指点指点呀。谢谢了先。

下面是用TCP客户端模拟包的错误信息:


加载中
0
c
cfqangelia
你好,请问你这个问题解决了吗
0
K
KeepMoving0325

   你好,这几天也在做websocket,用C语言组包。也是出现如题主类似的现象。题主提到的博客中有一段:

   在第一个事例中 0x81 表示该数据帧为与server通信的最后一个数据帧,   0x05 就是你想要发送的数据长度(该事例表示不使用掩码,如果server必须验证掩码就会出现乱码,而且server也忽略发送的数据)。而第二个事例中 0x81表示数据帧为最后一个数据帧, 0x85表示使用掩码(0x85&0x80=0x80)且数据长度为0x85&0x7F = 0x05。而后面的四字节0x37 0xfa 0x21 0x3d为掩码,后面5个字节则是“hello”与掩码异或的结果。

unsigned int build_websocket_msg(unsigned char* buf,unsigned int len)
{
//Mask 0x01010101
	unsigned int i,j;
	unsigned char  msg[200];
	msg[0] = 0x81;
	msg[1] = (len | 0x80);
	msg[2] = 0x01;
	msg[3] = 0x01;
	msg[4] = 0x01;
	msg[5] = 0x01;

	for(i = 0,j = 0;i < len;i++,j++)	
	{
		buf[i] = buf[i]^msg[j%4+2];
	}
	
	memcpy(&msg[6],buf,len);
	memcpy(buf,msg,len+6);
	return len + 6;
}

我设置的掩码为0x01 0x01 0x01 0x01.发送websocket数据包前面的两个字节是必须的,具体的选项设置,博客中有详细介绍。然后是四字节的掩码,然后是想要发送的数据与掩码的异或值。

    可能题主错误原因不是在这里,但希望上面的内容可以帮助到题主!



0
幸福猪猪
您好,请问此功能实现了吗,QQ8953979希望得到您的帮助,谢谢
返回顶部
顶部