📄 rtsprequest.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#define MAXBUF 1024
/************关于本文档********************************************
*filename: rtspRequest.c
*purpose: 演示IPv6网络下客户端连接流媒体服务器
*wrote by: caihao
*date time:2008-08-05
*Note:
*Thanks to:Google
*Hope:
*********************************************************************/
void Handel_OPTION(char *inbuffer);
void Handel_DESCRIBE(char *inbuffer, int sockfd);
void Handel_SETUP(char *inbuffer, int sockfd);
void Handel_PLAY(char *inbuffer, int sockfd,char *sessionId);
void Handle_PAUSE(char *inbuffer,int sockfd, char *sessionId);
void Handel_Teardown(char *inbuffer, int sockfd,char *sessionId);
int intsearch(char * buf, char * searchStr, int len);
int strsearch(char * buf, char * searchStr, int len,char *dest);
int udpSocket(int port, struct sockaddr_in6 *servaddr);
void udp_process(FILE * fp, int udpSockfd, struct sockaddr * udpSevAddr);
char sendOPTRequstStr[] = "OPTIONS rtsp://[fec0::123e:459f]:554/02700110332.ts RTSP/1.0\r\n";
char userAgentStr[] = "virtual client player\r\n";
char successfullyReplyStr[] = "RTSP/1.0 200 OK\r\n";
char sendDESRequstStr[] = "DESCRIBE rtsp://[fec0::123e:459f]:554/02700110332.ts RTSP/1.0\r\n";
char sendSETUPRequstStr[] = "SETUP rtsp://[fec0::123e:459f]:554/02700110332.ts/track1 RTSP/1.0\r\n";
char sendPLAYRequstStr[] = "PLAY rtsp://[fec0::123e:459f]:554/02700110332.ts RTSP/1.0\r\n";
char sendTeardownRequestStr[]="TEARDOWN rtsp://[fec0::123e:459f]:554/02700110332.ts RTSP/1.0\r\n";
char sendPauseRequestStr[]="PAUSE rtsp://[fec0::123e:459f]:554/02700110332.ts RTSP/1.0\r\n";
char CseqHeadStr[] = "Cseq: ";
char UserHeadStr[] = "User-Agent: ";
char ApplicationHeadStr[] = "Accept: ";
char TransportHeadStr[] = "Transport: ";
char SessionHeadStr[] = "Session: ";
char RangeHeadStr[] = "Range: ";
int cseqCount=0;
int main(int argc, char **argv)
{
int sockfd,rtpsockfd,rtcpsockfd, len;
struct sockaddr_in6 dest; // IPv6
char buffer[MAXBUF + 1] = {0};
int udpPort=0;
char serverIP[]="fec0::123e:459f";
int serverPort=554;
struct sockaddr_in6 RTPAddr;
struct sockaddr_in6 RTCPAddr;
cseqCount=0;
/* if (argc != 3) {
printf("parameter is error,you need write like this:\n\t\t%s IPaddr port\n\tfor example\t%s 127.0.0.1 80\n", argv[0], argv[0]);
exit(0);
}*/
/* 创建一个 socket 用于 RTSP 通信 */
if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) { // IPv6
perror("Socket");
exit(errno);
}
printf("socket created\n");
/* 初始化服务器端(对方)的地址和端口信息 */
bzero(&dest, sizeof(dest));
dest.sin6_family = AF_INET6; // IPv6
dest.sin6_port = htons(serverPort); // IPv6
if ( inet_pton(AF_INET6, serverIP, &dest.sin6_addr) < 0 ) { // IPv6
perror(serverIP);
exit(errno);
}
printf("address created\n");
/* 连接服务器 */
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
perror("Connect error\n");
exit(errno);
}
printf("server connected\n");
/* 此MAXBUF用来接收来自流媒体服务器的信息,最多接收 MAXBUF 个字节 */
bzero(buffer, MAXBUF + 1);
/* 发消息给服务器 */
Handel_OPTION(buffer);
len = send(sockfd, buffer, strlen(buffer), 0);
if (len < 0)
printf("OPTION Reply Msg:\n %s send error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("OPTION Reply Msg:\n %s send successfully,total content is %d bytes!\n", buffer, len);
bzero(buffer, MAXBUF + 1);
/* 接收服务器来的消息 */
//OPTION Reply
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("OPTION Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("OPTION Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr) -1) == 0)
Handel_DESCRIBE(buffer, sockfd);
else
{
printf("the OPTION answer Msg is wrong!\n");
return 0;
}
bzero(buffer, MAXBUF + 1);
//DESCRIBE Reply
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("DESCRIBE Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("DESCRIBE Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr)-1) == 0)
Handel_SETUP(buffer, sockfd);
else
{
printf("the DESCRIBE answer Msg is wrong!\n");
return 0;
}
bzero(buffer, MAXBUF + 1);
//SETUP Reply
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("SETUP Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("SETUP Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
char sessionIdTmp[30];
strsearch(buffer, "Session: ", 9, sessionIdTmp);
if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr)-1) == 0)
{
char searchStrTmp[13]="client_port=";
udpPort=intsearch(buffer,searchStrTmp,12);
if(udpPort==0)
return 0;
printf("the udp port is %d\n",udpPort);
bzero(&RTPAddr,sizeof(RTPAddr));
bzero(&RTCPAddr,sizeof(RTCPAddr));
if((rtpsockfd=udpSocket(udpPort,&RTPAddr))<0)
return 0;
if((rtcpsockfd=udpSocket(udpPort+1,&RTCPAddr))<0)
return 0;
Handel_PLAY(buffer, sockfd,sessionIdTmp);
}
else
{
printf("the SETUP answer Msg is wrong!\n");
return 0;
}
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("PLAY Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("PLAY Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr)-1) != 0)
{
printf("the play answer Msg is wrong!\n");
return 0;
}
bzero(buffer, MAXBUF + 1);
printf("now,receiving RTP packets data......\n");
udp_process(stdin,rtcpsockfd, (struct sockaddr*)&RTCPAddr);
Handle_PAUSE(buffer, sockfd, sessionIdTmp);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("PAUSE Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("PAUSE Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr)-1) != 0)
{
printf("the pause answer Msg is wrong!\n");
return 0;
}
bzero(buffer, MAXBUF + 1);
// Handel_PLAY(buffer,sockfd,sessionIdTmp);
Handel_Teardown(buffer, sockfd,sessionIdTmp);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0)
printf("teardown Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("teardown Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
/* 关闭连接 */
close(sockfd);
return 0;
}
void Handel_OPTION(char *inbuffer)
{
char strCseq[5]= {0};
cseqCount++;
//OPTION Request
memcpy(inbuffer, sendOPTRequstStr, sizeof(sendOPTRequstStr));
//Cseq number
sprintf(strCseq, "%d", cseqCount);
strcat(inbuffer + sizeof(inbuffer), CseqHeadStr);
strcat(inbuffer + sizeof(inbuffer), strCseq);
strcat(inbuffer + sizeof(inbuffer), "\r\n");
//user-Agent infomation
strcat(inbuffer + sizeof(inbuffer), UserHeadStr);
strcat(inbuffer + sizeof(inbuffer),userAgentStr);
strcat(inbuffer + sizeof(inbuffer), "\r\n");
}
void Handel_DESCRIBE(char *inbuffer, int sockfd)
{
char strCseq[5]= {0};
int len;
bzero(inbuffer, MAXBUF + 1);
cseqCount++;
//DESCRIBE Request
memcpy(inbuffer, sendDESRequstStr, sizeof(sendDESRequstStr));
//Cseq number
sprintf(strCseq, "%d", cseqCount);
strcat(inbuffer + sizeof(inbuffer), CseqHeadStr);
strcat(inbuffer + sizeof(inbuffer), strCseq);
strcat(inbuffer + sizeof(inbuffer), "\r\n");
//Application
strcat(inbuffer + sizeof(inbuffer), ApplicationHeadStr);
strcat(inbuffer + sizeof(inbuffer),"application/sdp");
strcat(inbuffer + sizeof(inbuffer), "\r\n");
//user-Agent infomation
strcat(inbuffer + sizeof(inbuffer), UserHeadStr);
strcat(inbuffer + sizeof(inbuffer),userAgentStr);
strcat(inbuffer + sizeof(inbuffer), "\r\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -