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文件即可,确保兼容性,确保不容易出错。
展开
折叠
C C++
1594
评论
共 0 个
内容存在敏感词
    易百纳技术社区暂无数据
相关资料
关于作者
易百纳技术社区
刘兵
贡献资料 6
易百纳技术社区 我上传的资料
登录查看
我赚取的积分
登录查看
我赚取的收益
登录查看
上传资料 赚取积分兑换E币
易百纳技术社区
删除原因
广告/SPAM
恶意灌水
违规内容
文不对题
重复发帖
置顶时间设置
结束时间
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-资料模块

审核失败

失败原因
备注
易百纳技术社区