libws:基于libevent的websocket实现
2 E币
成为会员,免费下载资料
文件大小:15.67 KB
上传者:刘兵
时间:2022-08-26 08:51:09
下载量:2
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。
Chromium、Memcached、NTP、HTTPSQS等著名的开源程序都使用libevent库,足见libevent的稳定。更多使用libevent的程序可以到libevent的官网查看。
但是libevent天生不支持websocket,在不少应用上都是要单独实现才行。
本方案libws,采用标准的libevent架构,调用http或https功能实现websocket。
1. libws服务器实现:
在初始化http/https时,set_new_ws函数设置用户的websocket接入处理,并返回libws的句柄即可,如果返回null,说明用户程序拒绝了客户端接入,libws库里面会相应回复客户端拒绝接入的信息。回调函数调用libws_in_cb即可,一旦客户端发送数据过来,就会相应调用websocket接入时的读写函数进行读写处理。
调用流程:
init_libws();
set_new_ws();
2. libws客户端实现:
调用libws_connect函数一站式完成。libws_connect函数须指定event_base,指定服务器的url,指定读、写、接入、关闭的回调函数,一切都是在用户指定的函数里面实现。exheader参数是http升级websocket时的http头,用户可以根据和服务器的约定,自定义一些http头,方便互相交互和识别。
3. libws_poll函数
该函数可以用在libevent的定时器里面,功能是维护连接,一旦某个ws连接30秒钟无响应。将会自动断开连接。
4. 关于并发
本人用此代码在互联网传输视频流上实现了多对多应用,但是服务器和客户端都是单线程实现的。如果并发量大的话,libevent天生支持多线程操作,可以在读写接入等回调函数里面采用线程锁,锁定临界区数据即可。
杂项:
websocket本身就是基于http或https,采用4个必选的http固定头实现Upgrade:websocket,Connection:Upgrade,Sec-WebSocket-Version:13,Sec-WebSocket-Key:****,服务器收到固定头之后,回复HTTP/1.1 101 Switching Protocols并加上Upgrade: websocket,Connection: Upgrade,Sec-WebSocket-Version: 13,Sec-WebSocket-Accept:****,然后进入长连接的互相交互。
libevent里面的http本身有超时机制,结束机制断开整个连接,所以在libws里面屏蔽libevent里面的主动断开机制,就实现了长连接,并且有效利用了libevent里面的http功能,减少代码量。
libws完全没修改libevent里面的代码,只是调用了部分功能。所以对于以后的libevent版本升级,直接升级libevent的so文件即可,确保兼容性,确保不容易出错。
展开》
折叠》