0%

libevent 源码中有一个 queue.h 文件,该文件里面定义了 5 种数据结构:

  • SLIST - 单向链表
  • LIST - 双向链表
  • SIMPLEQ - 简单队列
  • TAILQ - 尾队列
  • CIRCLEQ - 环形队列

其中 SLIST/SIMPLEQ/CIRCLEQlibevent 源码中没有被使用,所以本系列文章针对 LIST/TAILQ 进行一下分析。

本文分析的数据结构为 LIST 双向链表。

调试锁是 libevent 中用户可选的一种模式,它不仅可以调用前面设置的锁函数和条件变量函数,还可以捕获使用锁时的典型错误:重新锁定一个已锁定的非递归锁、解锁一个并未持有的锁。

libevent 的多线程接口文件相比日志模块和内存管理模块文件较多,可大致分为三部分:

  1. 内部接口所在头文件:evthread-internal.h
  2. 外部接口所在头文件:thread.h
  3. 接口实现所在文件:evthread.c & evthread_pthread.c & evthread_win32.c

libevent 的内存管理模块的头文件为 mm-internal.h,而相关函数的定义在文件 event_mm_malloc_ 中。

从头文件名就可以看出,同日志模块一样,libevent 的内存管理相关函数也只提供 libevent 内部使用,并不提供外部接口。

同时,也同日志模块一样,libevent 的内存管理模块也向用户提供了设置回调函数的接口,以方便用户自行实现内存管理函数。

libevent 的日志模块的文件为 log.clog-internal.h

从头文件名就可以看出,libevent 的日志函数只提供 libevent 内部使用,并不提供外部接口。

这些内部日志接口会在运行过程中一些异常情况时被调用,从而将这些异常的情况打印出来,告知用户。而在这些接口不满足用户的需求时,libevent 仍提供了回调函数设置接口方便用户自行修改日志模块的处理方式。

rtmpdump 是一个 C++ 的开源工程,也可以说是一个用来处理 RTMP 流媒体的工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, 和 rtmps:// 等。我们可以通过对 rtmpdump 的学习来学习 RTMP 协议。

首先可以了解一下其使用方法:rtmpdump 使用说明:

官网:http://rtmpdump.mplayerhq.hu/

在树莓派 Linux 环境折腾过程中,由于 Linux 系统开放的权限比较高,以 root 权限操作的话很有可能就会误删一些系统文件导致系统崩溃。我手里树莓派的系统搞挂过好几次,每次只能重新刷入镜像,开机后还得重复一大堆操作,所以备份树莓派的系统就很重要了。还可以把已经部署好的树莓派系统,批量复制到更多的树莓派上。

SRS/3.0,是一个流媒体集群,支持 RTMP/HLS/WebRTC/SRT/GB28181,高效、稳定、易用,简单而快乐。

Rtsp 认证 主要分为两种:

基本认证 (Basic authentication)和 摘要认证 (Digest authentication)

基本认证是 HTTP 1.0 提出的认证方案,其消息传输不经过加密转换因此存在严重的安全隐患。

摘要认证是 HTTP 1.1 提出的基本认证的替代方案,其消息经过 MD5 哈希转换因此具有更高的安全性。

握手之后,连接开始对一个或多个 chunk stream 进行合并。创建的每个块都有一个唯一 id 对其进行关联,这个 id 叫做 chunk stream id。这些块通过网络进行传输。传递时,每个块必须被完全发送才可以发送下一块。在接收端,这些块被根据 chunk stream id 被组装成消息。

每个块包含一个头和数据体。块头包含三个部分:

+--------------+----------------+--------------------+--------------+
| Basic Header | Message Header | Extended Timestamp |  Chunk Data  |
+--------------+----------------+--------------------+--------------+
|<------------------- Chunk Header ----------------->|
                            Chunk Format

RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。它是由 Adobe 公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。

该协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。

RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持 RTMP 协议的流媒体或交互服务器之间进行音视频和数据通信。

看前必读:

本博客基于 hexo v5.2.0NexT v8.0.1 搭建,本文的美化过程也是基于以上版本,不保证其他版本中的效果。

因为某些原因,我们需要在命令行下载一些国外的资源,这个时候如果使用 wgetcurl,或者 aria2c 的时候,往往又没有速度。这个时候我们需要使用代理来进行加速。

我本地搭的有 ss,但 ss 只支持 socks5 协议,而 wgetcurl 之类使用 http_proxy 进行代理的软件往往无法通过代理进行科学上网。我们可以利用一款名叫 ProxyChains-NG 的软件,chains 故名思义,可以支持代理链,这样我们可以在内部使用 Proxychainshttp_proxy 代理到 socks5 上,达到想要的效果。

项目开源地址:Github : https://github.com/rofl0r/proxychains-ng