⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtsprequest.c

📁 RTSP协议中的客户端实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -