websocket++库的使用:基于websocket模块收发RTSP 消息,作为一个RTSP测试工具

房东的猫 提交于 2019-11-27 02:25:58

一般来说,*.h里面只有声明,没有实现,而*.hpp里声明实现都可以有,后者可以减少.cpp的数量。 .h放声明,.cpp放实现,.hpp就是声明与实现在一起,比如模块类。   hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。        不可包含全局对象和全局函 由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。

 

随着手机游戏、H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议。Websocket协议是全双工的、基于数据帧的、建立在tcp之上的长连接协议。Websocket的协议是头是字符串的兼容http的,而握手之后的数据帧则是紧凑的二进制,所以websocket是紧凑和高效的。现在主流的PC浏览器以及手机浏览器对websocket都实现了非常成熟的支持。Websocket协议有着统一的标准的,所有websocket通讯无论实现的语言如何,无论使用的终端如何,最终都是一致的。   Websocket有公共的标准,有很多公共的库可以使用,比如web端,各个浏览器都已原生的支持websocket,所以拿来即用,非常的方便。比如cocos2dx就继承了websocket。 Websocket相对于http是长连接的,这样就可以实现实时的推送消息。 Websocket可以说完全治好了大家关于长连接使用什么协议的纠结。再游戏行业,服务器一般都是使用C++专门开发的网络程序,常规的一般都是使用比较传统的二进制协议,现在想用websocket的人越来越多,但是可以用于服务器端的websocket库却很少,要不就是库太重量级依赖了太多不需要的模块要不就是绑定了特定的网络接口实现。

websocketpp(WebSocket++)  是一个开源库,开源库的实现在 Y:\sync_7.19_listenSW\sync\vendors\websocketpp。   WebSocket++ 是一个只包含 C++ 头文件的 WebSocket 的 C++ 开发包,实现了 RFC 6455 也就是 WebSocket 协议。可以在 C++ 应用中实现 WebSocket 客户端和服务器端功能。使用可交换的网络传输模块,包括 C++ iostreams 和 Boost Asio。   这里汇总已知的可以在 C++ 中使用的 WebSocket 库。 uWebSockets、Crow、websocketpp、Beast 这样几个 C/C++ 的 WebSocket 库。                         基于C/C++的WebSocket库:libwebsockets是一个纯C语言的轻量级WebSocket库,它的CPU、内存占用很小,同时支持作为服务器端/客户端。 WebSocket++是一个仅仅由头文件构成的C++库,它实现了WebSocket协议(RFC6455),通过它,你可以在C++项目中使用WebSocket客户端或者服务器。WebSocket++使用两个可以相互替换的网络传输模块,其中一个基于C++ I/O流,另一个基于Asio。

Poco Websocket  POCO C++ 库是一个跨平台的 C++ 网络库。其中包含了 WebSocket 的实现模块。

WebSocket的C++服务器端实现:由于需要在项目中增加Websocket协议,与客户端进行通信,不想使用开源的库,比如WebSocketPP,就自己根据WebSocket协议实现一套函数,完全使用C++实现。代码已经实现,放在个人github上面,地址:https://github.com/jice1001/websocket.git。下面进行解释说明:

WebSocket 不是 JavaScript 的一个接口,而是一个定义良好的基于消息的协议。WebSocket 是一种网络通信协议,很多高级功能都需要它。得益于不同平台对于 WebSocket 协议的广泛实现,它更为跨多种平台的 实时网络应用程序 开发提供了极大的方便。除了可以在前端开发的 JavaScript 中使用 WebSocket 之外,我们也可以在 Java、C++、Go、Rust 等编程语言平台中使用 WebSocket。         WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。    

websocketpp 是 C++ 的 WebSocket 客户端/服务器库。它是一个开源的只包含头文件的 C++ 库,它实现了 RFC6455 WebSocket 协议。具体的协议内容可以在tools.ietf.org中查看。 协议共有 14 个部分,其中包括协议背景与介绍、握手、设计理念、术语约定、双端要求、掩码以及连接关闭等内容。  它允许向 C++ 程序中集成 WebSocket 客户端和服务器功能。它使用可交换的网络传输模块,包括基于 C++ iostreams 的和基于 Boost Asio的。   在以上的 6 个 C/C++ WebSocket 库中,其中有 3 个(Crow、websocketpp(WebSocket++)和 Beast)是基于 Boost 的网络库实现的。(WebSocket++在GitHub(链结)的主线,已经换成0.3了~所以不用像之前一样,还要自己切换到experimental的分支;而目前最新的版本,则是0.3.0 Alpha 4。而一样,由于他是基于Boost的ASIO来开发的,所以会需要额外准备Boost C++ Libraries。)

WebSocket++使用两个可以相互替换的网络传输模块,其中一个基于C++ I/O流,另一个基于Asio( (either via Boost or standalone).)。

主要特点

=======

*完全支持RFC6455

*部分支持hixie 76/hybi 00,07-17规范草案(仅服务器)

*基于消息/事件的接口

*支持安全WebSockets(TLS)、IPv6和显式代理。

*灵活的依赖管理(C++ 11标准库或Boost)

*可互换的网络传输模块(原始、iostream、asio或自定义)

*便携式/跨平台(POSIX/Windows、32/64位、Intel/ARM/PPC)

*线程安全

 

 

一、下载websocketpp、boost、openssl
WebSocketpp只是一个库,本身不需要搭建什么环境,只要新建的项目引入相关的库就行。但是WebSocketpp依赖于boost库和openssl库,这两个库需要编译生成lib库文件,在使用WebSocketpp库的工程中,需要引入boost库和openssl库的头文件和lib文件。openssl库是可选的。
https://github.com/zaphoyd/websocketpp
https://sourceforge.net/projects/boost/files/boost/1.62.0/ 下载boost最新版本1.62.0
https://github.com/openssl/openssl/releases下载openssl1.1.0版本

websocket使用wss协议,使用websocketpp库时,需要使用openssl库支持。
在工程属性中添加openssl头文件目录引用,增加openssl库文件目录引用。
在工程代码中添加对openssl部份引用:
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")

 

  webscoketpp是一个基于boost库的websocket实现,实现的相对完善一些。

websocket++需要boost的支持,所以工程中需要包含boost的头文件和库。

为什么需要 WebSocket?

我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

   举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。 轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。                   WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。  协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。       WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。       

握手是怎么回事?

WebSocket 是独立的、创建在 TCP 上的协议。Websocket 通过HTTP/1.1 协议的101状态码进行握手。为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。

  

开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。

一、通用标准类

   STL:C++标准模板库,呵呵,它也是开源的嘛。

   boost:C++准标准库,它是强大地,江湖称之"千锤百炼"。

-------若掌握,必横行世界。

 

WebSocketpp只是一个库,本身不需要搭建什么环境,只要新建的项目引入相关的库就行。但是WebSocketpp依赖于boost库和openssl库,这两个库需要编译生成lib库文件,在使用WebSocketpp库的工程中,需要引入boost库和openssl库的头文件和lib文件。

今天用到websocket,希望服务器端在连接建立时获取到客户端的IP,看了源码没有找到提供的api,后来一顿百度,在stackoverflow 找到了解决方案,经过测试可以使用,总结了一下, 下边是代码。

WebSocketpp只是一个库,本身不需要搭建什么环境,只要新建的项目引入相关的库就行。但是WebSocketpp依赖于boost库,因此开发之前还是有点东西要做的。1.下载boost库https://sourceforge.net/projects/boost/files/boost/1.62.0/  2.编译boost库。在boost根目录下打开命令行,执行bootstrap.bat脚本。生成bjam.exe和b2.exe,在命令行执行bjam.exe,坐等编译完成。(这两步只是按照默认的编译参数编译,十分简单,也可以自定义很多编译参数,我比较懒就没看了)      (BOOST 编译过程比较复杂,目前为了学习 BOOST,首先得搭建BOOST 开发环境。首先,请自行下载boost相关安装程序。如果是 32 位,下载 boost_1_55_0-msvc-12.0-32.exe;否则, boost_1_55_0-msvc-12.0-64.exe。随后安装相应的程序,程序安装过程较为简单不再赘述,其中安装的路径在后面配置VS2013时会用到。)(windows:

直接到以下网址下载编译好的,省去自己编译了(选择自己对应的ms版本,如VS2015  32位的选择boost_1_61_0-msvc-14.0-32.exe)

https://sourceforge.net/projects/boost/files/boost-binaries/1.61.0/

编译时加入包含目录和库目录即可)https://blog.csdn.net/xingxinmanong/article/details/65447874配置boost库是对的3.  配置三步:

第一步,把boost的根目录添加到include;

第二步,把websoketpp的根目录添加到include;

第三步,把boost/stage/lib添加到静态库。(https://blog.csdn.net/xingxinmanong/article/details/65447874#commentsedit

不能用VS2005,用VS2015如果出错(1>d:\visual_studio\vs2015\vc\include\xutility(2230): error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
),https://blog.csdn.net/byxdaz/article/details/84638249

 

 

 

Server_Test2和WebSocket_Test2两个文件夹分别是用websocketpp库写的客户端和服务端(都是教程里的),这两个代码具体参考C:\Users\yl2487\Desktop\github-websocket++\websocketpp-master\websocketpp-master\tutorials里的源码和他们的.md说明文件,说明文件要好好看,运行代码出错哪哪儿不能打开,要根据说明文件改动下教程里的源码。分别启动客户端和服务端。客户端连接本地9002端口,服务端监听本地9002端口。

close格式:close +id+1001+( ....     ...),说明本地可以连接上

服务器换成example文件夹里的echo_server文件,本地客户端可以给服务端发消息,服务端可以收到消息显示出来

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!