/*******************************RTSP STSRT**********************************/
// rtsp-创建套接字
rtspServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtsp-绑定套接字
bind(rtspServerSockfd, (struct sockaddr *)&rtsp_addr, sizeof(rtsp_addr));
// rtsp-开启监听
listen(rtspServerSockfd, 1); // 最多只有1个客户端连接
/*******************************RTSP END***********************************/
/*******************************RTP STSRT**********************************/
// rtp-创建套接字
rtpServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtp-绑定套接字
bind(rtpServerSockfd, (struct sockaddr *)&rtp_addr, sizeof(rtp_addr));
/*******************************RTP END************************************/
/*******************************RTCP START*********************************/
// rtcp-创建套接字
rtcpServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtcp-绑定套接字
bind(rtcpServerSockfd, (struct sockaddr *)&rtcp_addr, sizeof(rtcp_addr));
/*******************************RTCP END***********************************/
while(1)
{
...
// rtsp-等待客户端连接
accept(rtspServerSockfd, (struct sockaddr *)&addr_client, &addr_len);
// rtsp-创建客户端处理线程
pthread_create(&client_thrd, NULL, pthread_handle_client, pthread_arg);
}
• 执行顺序:socket -> bind -> listen -> accept -> pthread_handle_client
• 当有客户端连接后,创建线程。执行pthread_handle_client函数,接下来看pthread_handle_client函数实现
// pthread_handle_client函数实现
while(1)
{
// 接收客户端发来的数据
recv_len = recv(clientSockfd, rx_buf, RX_MAX_SIZE, 0);
// 解析客户端发来的数据
getFirstLineFromBuf();
sscanf();
/* 根据第一行解析的method的不同分别实现对应的响应返回,分别是:
** OPTIONS - handleCmd_OPTIONS()
** DESCRIBE - handleCmd_DESCRIBE()
** SETUP - handleCmd_SETUP()
** PLAY - handleCmd_PLAY()
** TEARDOWN - handleCmd_TEARDOWN()
*/
handleCmd_XXXX();
send(clientSockfd, tx_buf, strlen(tx_buf), 0);
}