1.史上最详细的源码网络编程实战教程
2.5分钟快速打造WebRTC视频聊天
3.网络I/O库总结(libevent,libuv,libev,libeio)
4.静态分析C语言生成函数调用关系的利器——cflow(二)
史上最详细的网络编程实战教程
本文通过介绍libhv——一个比libevent、libev、源码libuv更易用的源码跨平台国产网络库,旨在提供网络编程实战教程,源码帮助读者更好地理解TCP/UDP/SSL/HTTP/WebSocket网络编程。源码libhv提供了带非阻塞IO和定时器的源码商用发卡源码事件循环,适用于开发TCP/UDP/SSL/HTTP/WebSocket客户端/服务端。源码
项目地址:github.com/ithewei/libhv
码云镜像:gitee.com/libhv/libhv.gitee.com
QQ技术交流群:
libhv博客专栏:hewei.blog.csdn.net/cat
libhv源码分析:blog.csdn.net/qu/ca
libhv教程--目录
libhv是源码一个跨平台网络库,适用于开发TCP/UDP/SSL/HTTP/WebSocket客户端/服务端。源码
libhv教程--介绍与体验
libhv是源码一个高性能事件循环库,寓意High-performance event loop library(高性能事件循环库)。源码Linux与mac用户可直接执行getting_started.sh脚本体验libhv编写的源码作为客户端测试。
libhv教程--创建一个简单的源码TCP客户端
完整TCP/UDP客户端程序参考examples/nc.c,c++版本示例代码见evpp目录下的源码TcpClient_test.cpp。
libhv教程--创建一个简单的源码UDP服务端
以UDP echo server为例,使用libhv创建UDP服务端。编译运行后,可使用nc作为客户端测试。
libhv教程--创建一个简单的UDP客户端
完整TCP/UDP客户端程序参考examples/nc.c,c++版本示例代码见evpp目录下的lol 插件源码UdpClient_test.cpp。
libhv教程--创建一个简单的HTTP服务端
以HTTP协议为例,使用libhv创建HTTP服务端。c版本示例代码参考examples/http_server_test.cpp,c++版本示例代码参考evpp目录下的HttpServer_test.cpp。
libhv教程--创建一个简单的HTTP客户端
完整HTTP客户端示例代码参考examples/curl.cpp,模拟实现了curl命令行程序。
libhv教程--创建一个简单的WebSocket服务端
以WebSocket协议为例,使用libhv创建WebSocket服务端。示例代码参考examples/websocket_server_test.cpp。
libhv教程--创建一个简单的WebSocket客户端
WebSocket客户端示例代码参考examples/websocket_client_test.cpp。
libhv教程--实现一个纯C版jsonrpc框架
使用libhv实现一个行内的jsonrpc框架,借助libhv提供的接口hio_set_unpack设置拆包规则,大大节省了处理粘包与分包的成本。
libhv教程--实现一个C++版protorpc框架
实现一个行内的C++版protorpc框架,使用evpp模块+protobuf实现。
创作不易,如果你觉得不错,请在github上star下吧。
5分钟快速打造WebRTC视频聊天
搭建WebRTC环境以实现视频聊天的deskclock源码分析步骤包括三个核心元素:NAT穿透服务器(ICE Server)、信令服务器(Signaling Server)以及Web客户端。
1. 准备工作:服务器运行环境为CentOS 7.3,需自行安装Node.js和Git。客户端支持Firefox浏览器,因Chrome浏览器需要HTTPS支持,故仅支持Firefox。为了公网上实现视频通信,需部署NAT穿透服务器(ICE Server),实现内网穿透的方式主要有STUN和TURN两种。
2. 安装NAT穿透服务器(ICE Server):本例中使用coturn作为TURN服务器。安装命令如下。若出现./configure失败,则需要安装openssl和Libevent2。复制example/etc下的turnserver.conf文件到bin文件夹,并根据需求修改配置。启动服务后,可以在 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 测试连接是否成功。运行日志可随时查看在/var/log文件夹中。
3. 信令服务器(Signaling Server):选择signalmaster作为信令服务器,dnf源码wpe基于WebSocket。确保服务器能够连接TURN服务器。需调整sockets.js源码中的行代码以支持用户名/密码验证。配置turnserver用户和密码后,启动服务器。
4. Web客户端:快速搭建HTML页面,可参考相关教程实现网页版多人文本、视频聊天室。若时间紧张,直接下载现有代码部署即可。注意修改第二步中信令服务器的地址。完成部署后,使用Firefox浏览器访问搭建好的页面,即可实现视频和文本通信。
通过以上步骤,一个简单的WebRTC视频聊天程序即搭建完成。此过程详细说明了从准备环境、安装核心组件到实现客户端通信的全过程,简化了搭建WebRTC视频聊天系统的emwin源码分析复杂度,使得开发过程更为高效。
网络I/O库总结(libevent,libuv,libev,libeio)
Libevent
Libevent 是一个基于事件驱动模型的非阻塞网络库,用于构建高速、可移植的非阻塞 IO 应用。广泛应用于 memcached、Vomit、Nylon、Netchat 等项目中,作为底层网络库,用于实现 TCP 或 HTTP 服务。Libevent 的 GitHub 源码可访问。
Libev
Libev 是由 Marc Lehmann 独立完成的,对不同系统非阻塞模型进行简单封装,解决了不同 API 之间的不兼容问题,保证程序在大多数 *nix 平台上运行。Libev 支持类 UNIX 系统的多种 I/O 多路复用模型,如 select、poll、epoll、kqueue、evports 等,但对于 Windows 的支持仅限于 select 模型,效率较低,性能不如 Libuv 封装的 IOCP。Libev 目标是修复 Libevent 的一些设计问题,如避免使用全局变量,提供更高效的事件类型管理。
Libuv
Libuv 是一个跨平台、高性能、事件驱动的异步 IO 库,用 C 语言编写,封装了不同平台底层的高性能 IO 模型,如 epoll、kqueue、IOCP、event ports,具有高度可移植性。Libuv 为 Node.js 设计,但因其高效模型逐渐被其他语言和项目采纳,用于底层库,如 Luvit、Julia、uvloop、pyuv 等。
Libevent、Libev、Libuv 比较
根据 GitHub 星标数,Libuv 的影响力最大,其次是 Libevent,Libev 关注较少。在优先级、事件循环、线程安全等方面,Libuv 更为现代,支持多种平台和 IO 模型,提供了更优的性能和功能。Libevent 和 Libev 分别针对不同平台和需求进行优化,Libev 旨在修复 Libevent 的问题。性能和可移植性方面,Libuv 优于 Libevent 和 Libev。
异步 IO 实现
目前 Linux 异步 IO 实现有原生异步 IO 和多线程模拟异步 IO 两种方式。原生异步 IO 支持特定场景,但不充分利用 Page cache;多线程模拟异步 IO 方式如 Glibc AIO、libeio、io_uring 等,提供更广泛的适用场景。
静态分析C语言生成函数调用关系的利器——cflow(二)
在过去的六年里,我持续分享关于IT项目研发中的实用工具系列,近期计划更新并增加其他语言的“神器”。在之前的《静态分析C语言生成函数调用关系的利器——cflow》中,我们讲解了cflow如何查看C语言代码中的函数调用链,但老版本的cflow不支持直接导出dot文件,需要额外工具辅助。然而,cflow的最新版本(v1.7)已经解决了这个问题。
虽然市面上关于cflow的示例通常较为基础,适合单一文件和简单调用结构,但实际工作中,代码库的复杂性可能使这些教程显得不足。因此,本文将深入探讨如何在复杂项目中应用cflow。我选择了著名的libevent库作为分析对象,该库支持Google Chrome等项目,代码结构较为规范。
首先,我们需要在Ubuntu 环境下安装cflow和graphviz。然后,从libevent的github仓库获取代码,重点分析test目录下的test-time.c文件中main函数的调用关系。初始分析仅能看到test-time.c内部的函数调用,对于更深的层次则无法揭示。
为了获取更全面的调用图,我们需要进行高级分析。这涉及到指定所有基础c文件给cflow,处理可能出现的重定义错误,例如添加`--include-dir`选项以指定头文件路径。在这个过程中,可能会遇到编译时生成的文件缺失、不同操作系统间的差异等问题,需要根据具体情况进行解决。
最后,通过一系列的路径调整、宏定义和文件后缀修改,我们成功地生成了关于main函数所有调用函数的调用栈。完成这些步骤后,可以通过cflow指令生成可视化图,展示项目的函数调用关系。完整的分析过程和解决的挑战为开发者在实际项目中使用cflow提供了实践参考。