Web Socket rfc6455 握 (C++)

简介:
std::string data((const char*)buf->data(),bytes_transferred);
				recycle_buffer(buf);

				std::string key="Sec-WebSocket-Key:";
				auto pos = data.find(key);
				auto posEnd = data.find("\r\n",pos);
				auto value = data.substr(pos + key.length(),posEnd - (pos + key.length()));
				std::string sha1Src = trim(value);
				sha1Src += std::string("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");

				unsigned char sha1out[20];
				sha1((const unsigned char *)sha1Src.c_str(),sha1Src.length(),sha1out);
				std::vector<unsigned char> data64;
				for( auto c: sha1out) data64.push_back(c);


				std::ostringstream os_rsp;
				os_rsp<<"HTTP/1.1 101 Switching Protocols\r\n"
    				  <<"Upgrade: websocket\r\n"
				      <<"Connection: Upgrade\r\n"
				      <<"Sec-WebSocket-Accept: "<<base64Encode(data64)<<"=\r\n"
					  <<"\r\n";
				std::string rsp = os_rsp.str();

1) data 为连接建立以后,web socketclient发送的握手协议。

2)查询到字段 Sec-WebSocket_key的值,而且拼接上GUID字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"值。

得到 sha1Src

3)对 key拼接后的值计算 sha1值,得到 sha1Out

4)应答,最基本的就是计算 Sec-WebSocket-Accept值。通过函数 base64Encode进行计算。


using namespace std;
static const unsigned char bt[64]=
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
};
std::string base64Encode(const std::vector<unsigned char> & data ){

	std::list< std::bitset<8> > bits;
	for( auto c : data ){
	        std::bitset<8> bit(c);
	        bits.push_back(bit);
	}
	while( bits.size() % 3 != 0 ) bits.push_back( bitset<8>() );

	std::vector<unsigned char> base64;
	while( !bits.empty() ){
		std::bitset<6> bit6_1,bit6_2,bit6_3,bit6_4;
  		std::bitset<8> bit8_1 = *bits.begin(); bits.pop_front();
        std::bitset<8> bit8_2 = *bits.begin(); bits.pop_front();
        std::bitset<8> bit8_3 = *bits.begin(); bits.pop_front();

   		bit6_1.set(0, bit8_1[2]);
        bit6_1.set(1, bit8_1[3]);
        bit6_1.set(2, bit8_1[4]);
        bit6_1.set(3, bit8_1[5]);
        bit6_1.set(4, bit8_1[6]);
        bit6_1.set(5, bit8_1[7]);

        bit6_2.set(0, bit8_2[4]);
        bit6_2.set(1, bit8_2[5]);
        bit6_2.set(2, bit8_2[6]);
        bit6_2.set(3, bit8_2[7]);
        bit6_2.set(4, bit8_1[0]);
        bit6_2.set(5, bit8_1[1]);

        bit6_3.set(0, bit8_3[6]);
        bit6_3.set(1, bit8_3[7]);
        bit6_3.set(2, bit8_2[0]);
        bit6_3.set(3, bit8_2[1]);
        bit6_3.set(4, bit8_2[2]);
        bit6_3.set(5, bit8_2[3]);

        bit6_4.set(0, bit8_3[0]);
        bit6_4.set(1, bit8_3[1]);
        bit6_4.set(2, bit8_3[2]);
        bit6_4.set(3, bit8_3[3]);
        bit6_4.set(4, bit8_3[4]);
        bit6_4.set(5, bit8_3[5]);

    	base64.push_back( bt[bit6_1.to_ulong() ]);
        base64.push_back( bt[bit6_2.to_ulong() ]);
        base64.push_back( bt[bit6_3.to_ulong() ]);
        base64.push_back( bt[bit6_4.to_ulong() ]);
	}
	base64.pop_back();
	string strdata(base64.begin(),base64.end());

	return strdata;
}

5) 计算后把RSP发生出去能够。



版权声明:本文博主原创文章。博客,未经同意不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4906390.html,如需转载请自行联系原作者


相关文章
|
5月前
|
Python
python高级-socket和web相关(下)
python高级-socket和web相关(上)
46 0
|
5月前
|
网络协议 Python
python高级-socket和web相关(上)
python高级-socket和web相关
45 0
|
6月前
|
开发框架 移动开发 网络协议
ASP.NET Core 使用 Web Socket
ASP.NET Core 使用 Web Socket
50 0
|
7月前
|
Web App开发 监控 程序员
使用 ABAP 开发的一个基于 Web Socket 的小工具,能提高程序员日常工作效率
使用 ABAP 开发的一个基于 Web Socket 的小工具,能提高程序员日常工作效率
46 0
|
7月前
|
移动开发 JavaScript 网络协议
web socket (记录下来方便观看)
web socket (记录下来方便观看)
29 0
|
12月前
|
缓存 网络协议 JavaScript
HTML学习笔记(九) Web Socket
HTML学习笔记(九) Web Socket
117 0
|
网络协议 C语言 C++
【Socket】C语言编写Web服务器
【Socket】C语言编写Web服务器
|
前端开发 JavaScript Windows
|
Web App开发 监控 前端开发
如果监控摄像头不支持Web Socket,猿大师播放器还能在网页中播放RTSP流吗?
猿大师播放器在前端用web socket是浏览器和中间件及播放程序之间的通讯协议,和实际播放无关,只要浏览器支持web socket就可以播放,现在大部分浏览器都支持web socket,所以就算监控设备不支持Websocket,用猿大师播放器播放RTSP也是是没问题的。
178 0
如果监控摄像头不支持Web Socket,猿大师播放器还能在网页中播放RTSP流吗?
|
监控 前端开发 Java
Spring Boot + Web Socket 打造实时监控异常,写得太好了!
Spring Boot + Web Socket 打造实时监控异常,写得太好了!
257 0
Spring Boot + Web Socket 打造实时监控异常,写得太好了!