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上查看到手册文档。