int send_play_reply(RTSP_buffer * rtsp, char *object, RTSP_session * rtsp_session) { char r[1024]; char temp[30]; RTP_session *p = rtsp_session->rtp_session; TRACE_FUNC(); /* build a reply message */ sprintf(r, "%s %d %s" RTSP_EL "CSeq: %d" RTSP_EL "Server: %s/%s" RTSP_EL, RTSP_VER, 200, get_stat(200), rtsp->rtsp_cseq, PACKAGE, VERSION); add_time_stamp(r, 0); strcat(r, "Session: "); sprintf(temp, "%d", rtsp_session->session_id); strcat(r, temp); strcat(r, RTSP_EL); // strcat(r, "RTP-info: url="); strcat(r, "RTP-info: "); // strcat(r, object); // strcat(r, ";"); do { strcat(r, "url="); // strcat(r, object); // TODO: we MUST be sure to send the correct url sprintf(r + strlen(r), "rtsp://%s/%s/%s!%s", prefs_get_hostname(), p->sd_filename, p->sd_filename, p->current_media->filename); strcat(r, ";"); sprintf(r + strlen(r), "seq=%u;rtptime=%u", p->start_seq, p->start_rtptime); if (p->next != NULL) { strcat(r, ","); } else { // strcat(r, "\r\n\r\n"); strcat(r, RTSP_EL); } p = p->next; } while (p != NULL); // end of message strcat(r, RTSP_EL); bwrite(r, (unsigned short) strlen(r), rtsp); // INFOLOGG("200 - %s ", object); return ERR_NOERROR; }
int send_play_reply(RTSP_buffer * pRtsp, RTSP_session * pRtspSessn) { char s8Str[1024]; char s8Temp[30]; sprintf(s8Str, "%s %d %s"RTSP_EL"CSeq: %d"RTSP_EL"Server: %s/%s"RTSP_EL, RTSP_VER, 200,\ get_stat(200), pRtsp->rtsp_cseq, PACKAGE, VERSION); add_time_stamp(s8Str, 0); sprintf(s8Temp, "Session: %d"RTSP_EL, pRtspSessn->session_id); strcat(s8Str, s8Temp); strcat(s8Str, RTSP_EL); bwrite(s8Str, (unsigned short) strlen(s8Str), pRtsp); return ERR_NOERROR; }
int SendDescribeReply(RTSP_buffer * rtsp, char *object, char *descr, char *s8Str) { char *pMsgBuf; /* 用于获取响应缓冲指针*/ int s32MbLen; /* 分配空间,处理内部错误*/ s32MbLen = 2048; pMsgBuf = (char *)malloc(s32MbLen); if (!pMsgBuf) { fprintf(stderr,"send_describe_reply(): unable to allocate memory\n"); send_reply(500, 0, rtsp); /* internal server error */ if (pMsgBuf) { free(pMsgBuf); } return ERR_ALLOC; } /*构造describe消息串*/ sprintf(pMsgBuf, "%s %d %s"RTSP_EL"CSeq: %d"RTSP_EL"Server: %s/%s"RTSP_EL, RTSP_VER, 200, get_stat(200), rtsp->rtsp_cseq, PACKAGE, VERSION); add_time_stamp(pMsgBuf, 0); /*添加时间戳*/ strcat(pMsgBuf, "Content-Type: application/sdp"RTSP_EL); /*实体头,表示实体类型*/ /*用于解析实体内相对url的 绝对url*/ sprintf(pMsgBuf + strlen(pMsgBuf), "Content-Base: rtsp://%s/%s/"RTSP_EL, s8Str, object); sprintf(pMsgBuf + strlen(pMsgBuf), "Content-Length: %d"RTSP_EL, strlen(descr)); /*消息体的长度*/ strcat(pMsgBuf, RTSP_EL); /*消息头结束*/ /*加上消息体*/ strcat(pMsgBuf, descr); /*describe消息*/ /*向缓冲区中填充数据*/ bwrite(pMsgBuf, (unsigned short) strlen(pMsgBuf), rtsp); free(pMsgBuf); return ERR_NOERROR; }
int send_teardown_reply(RTSP_buffer * pRtsp, long SessionId, long cseq) { char s8Str[1024]; char s8Temp[30]; // 构建回复消息 sprintf(s8Str, "%s %d %s"RTSP_EL"CSeq: %ld"RTSP_EL"Server: %s/%s"RTSP_EL, RTSP_VER,\ 200, get_stat(200), cseq, PACKAGE, VERSION); //添加时间戳 add_time_stamp(s8Str, 0); //会话ID sprintf(s8Temp, "Session: %ld"RTSP_EL, SessionId); strcat(s8Str, s8Temp); strcat(s8Str, RTSP_EL); //写入缓冲区 bwrite(s8Str, (unsigned short) strlen(s8Str), pRtsp); return ERR_NOERROR; }
int send_setup_reply(RTSP_buffer *pRtsp, RTSP_session *pSession, RTP_session *pRtpSes) { char s8Str[1024]; sprintf(s8Str, "%s %d %s"RTSP_EL"CSeq: %ld"RTSP_EL"Server: %s/%s"RTSP_EL, RTSP_VER,\ 200, get_stat(200), (long int)pRtsp->rtsp_cseq, PACKAGE, VERSION); add_time_stamp(s8Str, 0); sprintf(s8Str + strlen(s8Str), "Session: %d"RTSP_EL"Transport: ", (pSession->session_id)); switch (pRtpSes->transport.type) { case RTP_rtp_avp: if (pRtpSes->transport.u.udp.is_multicast) { // sprintf(s8Str + strlen(s8Str), "RTP/AVP;multicast;ttl=%d;destination=%s;port=", (int)DEFAULT_TTL, descr->multicast); } else { sprintf(s8Str + strlen(s8Str), "RTP/AVP;unicast;client_port=%d-%d;destination=192.168.245.65;source=%s;server_port=", \ pRtpSes->transport.u.udp.cli_ports.RTP, pRtpSes->transport.u.udp.cli_ports.RTCP,"192.168.245.96"); } sprintf(s8Str + strlen(s8Str), "%d-%d"RTSP_EL, pRtpSes->transport.u.udp.ser_ports.RTP, pRtpSes->transport.u.udp.ser_ports.RTCP); break; case RTP_rtp_avp_tcp: sprintf(s8Str + strlen(s8Str), "RTP/AVP/TCP;interleaved=%d-%d"RTSP_EL, \ pRtpSes->transport.u.tcp.interleaved.RTP, pRtpSes->transport.u.tcp.interleaved.RTCP); break; default: break; } strcat(s8Str, RTSP_EL); bwrite(s8Str, (unsigned short) strlen(s8Str), pRtsp); return ERR_NOERROR; }
S32 send_play_reply(S32 status,S32 cur_conn_num) { CHAR temp[255]; if(!rtsp[cur_conn_num]->out_buffer) { return -1; } /* build a reply message */ sprintf(rtsp[cur_conn_num]->out_buffer, "%s %d %s"RTSP_EL"CSeq: %d"RTSP_EL"Server: %s/%s"RTSP_EL, RTSP_VER, status, (CHAR *)get_stat(status), rtsp[cur_conn_num]->rtsp_cseq, PACKAGE, VERSION); add_time_stamp(rtsp[cur_conn_num]->out_buffer, 0); strcat(rtsp[cur_conn_num]->out_buffer, "Session: "); sprintf(temp, "%d", rtsp[cur_conn_num]->session_id); strcat(rtsp[cur_conn_num]->out_buffer, temp); strcat(rtsp[cur_conn_num]->out_buffer, RTSP_EL); strcat(rtsp[cur_conn_num]->out_buffer, RTSP_EL); if(write(rtsp[cur_conn_num]->cli_rtsp.cli_fd, rtsp[cur_conn_num]->out_buffer, strlen(rtsp[cur_conn_num]->out_buffer))<0){ printf("send_play_reply error\n"); return -1; } return 0; }