vlc-源码分析--rtsp服务端-单线程IO复用模型

本文解析了VLC中的RTSP服务端实现,重点介绍了单线程IO复用模型及RTP数据传输机制。VLC采用live555开源库进行网络视频流接收,并自实现了RTSP服务端部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vlc使用了live555开源库,但是只是播放网络视频流的时候用live555作为 接受,对于串流rtsp功能,为自行实现的一个服务端程序,单线程IO复用服务端模型。这里分析下这个服务端的源码 位于 src/network/httpd.c

在这里插入图片描述
这里仅仅rtsp的服务端,不涉及到rtp具体的传输视频,rtp传输数据是另外的线程。rtp传输数据没有涉及到网络通信的交互,服务端收到rtsp的控制,创建udp socket(vlc 只支持rtp-udp),然后单纯服务端往这个socket写rtp的数据。单向的传输数据,包括rtcp也和rtp基本一致。

看这个rtsp服务端的大概模型,使用单线程,io复用的方式,处理所有连接客户端的读写,已经监听新的服务端的连接允许连接的最大用户量:listen (fd, INT_MAX),INT_MAX几乎是没有限制的。
这里使用到的 IO复用检测,是pool函数。
int poll (struct pollfd *fds, size_t nfds , int timeout);

struct pollfd {
int fd; /* 文件描述符 /
short events; /
等待的事件 /
short revents; /
实际发生了的事件 */
};

#include <sys/poll.h>
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符;每当调用这个函数之后,系统不会清空这个数组,操作起来比较方便;特别是对于 socket连接比较多的情况下,在一定程度上可以提高处理的效率;这一点与select()函数不同,调用select()函数之后,select() 函数会清空它所检测的socket描述符集合,导致每次调用select()之前都必须把socket描述符重新加入到待检测的集合中;因 此,select()函数适合于只检测一个socket描述符的情况,而poll()函数适合于大量socket描述符的情况;
nfds:nfds_t类型的参数,用于标记数组fds中的结构体元素的总数量;
timeout:是poll函数调用阻塞的时间,单位:毫秒;

man poll 可以在ubuntu上查看到手册文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值