vlc-源碼分析--rtsp服務端

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上查看到手冊文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章