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

📄 restdemo.c

📁 基于Nucleus的RTSP协议的简单实例
💻 C
字号:
#include <stdio.h>
#include "gloab.h"

int Seq=1;                                                          /*初始序列号*/
char *sessionid;
char *Path="rtsp://example.com/fizzle/foo";	



NU_MEMORY_POOL dm_memory;
NU_TASK task_1;
NU_TASK task_2;


VOID *stack_1;
VOID *stack_2;
RtspRequest rtsprequest;

VOID entry_1(UNSIGNED argc, VOID *argv);
VOID entry_2(UNSIGNED argc, VOID *argv);

INT  ResponseBuilder(RtspRequest user);
INT  RequestBuilder(INT meth);  //<0表示失败
INT  ResponseParser();
INT  RequestParser(RtspRequest* rtsprequest);
char *GetSessionId(char *);

VOID Application_Initialize(VOID *first_available_memory)
{
	//STATUS status;

	memset(request,'0',100);
	memset(response,'0',100);
	NU_Create_Memory_Pool(&dm_memory, "sysmem", first_available_memory,
		10240, 10, NU_FIFO);

	NU_Allocate_Memory(&dm_memory, &stack_1, 1024, NU_NO_SUSPEND);
	NU_Create_Task(&task_1, "TASK1", entry_1, 0, NU_NULL, stack_1,
		1024, 10, 1, NU_PREEMPT, NU_START);

	NU_Allocate_Memory(&dm_memory, &stack_2, 1024, NU_NO_SUSPEND);
	NU_Create_Task(&task_2, "TASK2", entry_2, 0, NU_NULL, stack_2,
		1024, 10, 1, NU_PREEMPT, NU_NO_START);

	

}

void entry_1(UNSIGNED argc, VOID *argv)
{

	CHAR answer;
	INT result;
	INT flag=1;
	CHAR *temp;
	NU_Allocate_Memory(&dm_memory, &temp, 5*sizeof(char), NU_NO_SUSPEND);
	sessionid=(char *)temp;
	//sessionid=(char *)memory_allocate(5*sizeof(char));  //初始化sessionid
	GetSessionId(sessionid);  

    printf("DO you want to play?(y/n)\n\n");
	scanf("%c",&answer); 
	NU_Resume_Task(&task_2);

	if (answer=='y')
	{
        // printf("RequestBuilder(1000) is ok!\n");
		 result=RequestBuilder(1000);/*request[99]='1';*/

		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
        while (flag==1)
        {
			NU_Sleep(100);
            if (response[99]=='1')
            {
                result=ResponseParser();
				flag=0;
            }
			else
			{
				printf("还没有回复!\n");
			}
        }
		flag=1;
        result=RequestBuilder(1005);
        //printf("RequestBuilder(1005) is ok!\n");
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
			 NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1001) is ok!\n");
		result=RequestBuilder(1001);
        
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
            NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1001) is ok!\n");
		result=RequestBuilder(1001);
        
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
			 NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1004) is ok!\n");
		result=RequestBuilder(1004);
        
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
			 NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1002) is ok!\n");
		result=RequestBuilder(1002);
        
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
            NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1004) is ok!\n");
		result=RequestBuilder(1004);
        
		if (result<0)
		{
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
			 NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
		flag=1;
		//printf("RequestBuilder(1003) is ok!\n");
		result=RequestBuilder(1003);
        
		if (result<0)
		{
            NU_Sleep(100);
			printf("构造失败!\n");
			return ;
		}
		while (flag==1)
		{
			 NU_Sleep(100);
			if (response[99]=='1')
			{
                result=ResponseParser();
				flag=0;
			}
			else
			{
				printf("还没有回复!\n");
			}
		}
	}
	else
	{
		printf("操作已结束!\n");
	}
      


}

void entry_2(UNSIGNED argc, VOID *argv)
{
	
	INT flag=1;
	
	INT result;


	printf("服务器已经启动!\n\n");
	while (flag==1)
	{
		NU_Sleep(100);
		if (request[99]=='1')
		{
           result=RequestParser(&rtsprequest);

		   if (result>0)
		   {   //printf("ResponseBuilder() is ok!\n");
			   result=ResponseBuilder(rtsprequest);
			   
		   } 
		   else
		   {
			   printf("服务器构造失败!\n");
			   return;
		   }
		} 
	  else
		{
			printf("目前服务器处于空闲状态!\n");
			//flag=0;
		}
	}

}
INT ResponseBuilder(RtspRequest user)
{
  
	//if(user.Ver==NU_NULL||user.Cseq==NU_NULL||user.FilePath==NU_NULL||user.Method==NU_NULL||user.SessionId==NU_NULL)							
	//{
		//printf("Not have Request Message!\n");
		//return 0;
	//}                                                /*此处应该还有状态码的判定,暂缺*/

	strcpy(response,user.Ver);
	strcat(response," ");
	strcat(response,"200");
	strcat(response," ");
	strcat(response,"OK");
	strcat(response,"\r\n");
	strcat(response,"CSeq: ");
	strcat(response,user.Cseq);
	strcat(response,"\r\n");
	strcat(response,"Session: ");
	strcat(response,user.SessionId);
	strcat(response,"\r\n");
	strcat(response,"\r\n");

	
	
   response[99]='1';
   return 1;
}
INT RequestBuilder(INT meth)
{
  	
	RtspRequest RtspMsg;
    CHAR seqnum[3];
	void *temp;
    NU_Allocate_Memory(&dm_memory, &temp, 3*sizeof(char), NU_NO_SUSPEND);
    RtspMsg.Cseq=(char *)temp;
	
	if (meth<1000||meth>1005)
	{
		printf("Method invalidation!\n");
		return 0;
	}
	itoa( Seq,seqnum,10 );
	RtspMsg.Ver="RTSP/1.0";
	RtspMsg.Method=Method_Code+(meth-OPTIONS);
	RtspMsg.FilePath=Path;
	//RtspMsg.Cseq=(char *)memory_allocate(3*sizeof(char));
	strcpy(RtspMsg.Cseq,seqnum);
	//RtspMsg.SessionId=GetSessionId();
	//RtspMsg.SessionId=(char *)memory_allocate(5*sizeof(char));
	//GetSessionId(RtspMsg.SessionId);
	RtspMsg.SessionId=sessionid;


	strcpy(request,RtspMsg.Method);
	strcat(request," ");
	strcat(request,RtspMsg.FilePath);
	strcat(request," ");
	strcat(request,RtspMsg.Ver);
	strcat(request,"\r\n");
	strcat(request,"CSeq: ");
	strcat(request,RtspMsg.Cseq);
	strcat(request,"\r\n");
	strcat(request,"Session: ");
	strcat(request,RtspMsg.SessionId);
	strcat(request,"\r\n");
	strcat(request,"\r\n");
	Seq++;
	//Messsage=&Msg;
	//strcpy(request,Msg);
	//memset(request,'2',99);
    request[99]='1';
	printf("请求包已构造,内容如下:\n%s",request);
	//NU_Sleep(1000);
	//return 1;
	
	//memset(request,'2',99);
    request[99]='1';
	return 1;
}
INT  ResponseParser()
{
	char Version[10];
	char code[4];
	char reason[50];
	char headers[100];
	int CRLF_count=0;//记录连续的CRLF个数,当有两个CRLF时表示headers结束

	int bodyLength=0;//message body 的长度,以bytes为单位,其值在Content-Length header中指定,若没有指定,则假定其值为0
	char strBodyLength[10];
	char body[100];
	char *ch=NU_NULL;//存Content-Length在response中出现的位置
	int temp;
	int i=0;
	int j=0;
	//int k=0;


	//1.读取RTSP版本
	while( ' ' != response[i] && i < 9)
	{
		Version[j]=response[i];
		i++;
		j++;
	}
	Version[j]='\0';

	if( 0 != strcmp(Version,"RTSP/1.0") )
	{
		printf("This packet is not a standard RTSP response!\n");
		return -1;
	}


	//2.读取状态码
	i++;
	j=0;
	while( ' ' != response[i] )
	{
		code[j]=response[i];
		i++;
		j++;
	}
	code[j]='\0';

	//3.读取原因
	i++;
	j=0;
	while( '\r' != response[i] )
	{
		reason[j]=response[i];
		i++;
		j++;
	}
	reason[j]='\0';

	if( '\n'!= response[++i] )
	{
		printf("bad response!\n");
		return -1;
	}

	//4.读取message header
	i++;
	j=0;
	while( 2 != CRLF_count )
	{
		if( '\r' ==response[i] )
		{
			if( '\n'==response[++i] )
			{
				CRLF_count++;
				//if( 1==CRLF_count )
				headers[j]='\n';
			}
			else
			{
				printf("bad header!\n");
				return -1;

			}
		}
		else
		{
			headers[j]=response[i];
			CRLF_count=0;
		}

		i++;
		j++;
	}
	headers[j]='\0';
	//查找Content-Length 并获得它的值
	ch=strstr(response,"Content-Length:");
	if( NU_NULL != ch )
	{
		ch+=15;
		j=0;
		while( '\r' != *ch )
		{
			strBodyLength[j]=*ch;
			ch++;
			j++;
		}
		strBodyLength[j]='\0';
		bodyLength=atoi(strBodyLength);
	}


	//5.读取message body
	j=0;
	if( 0 != bodyLength )
	{
		temp=i;
		for(;i<temp+bodyLength;i++,j++)
		{
			body[j]=response[i];
		}
		body[j]='\0';
	}

	//输出
	//Status-Line
	printf("回复包如下:\n");
	printf("%s %s %s\n",Version,code,reason);
	//headers
	printf("%s",headers);
	//body
	if( 0 != bodyLength )
		printf("%s",body);
	memset(response,'0',100);
	return 1;
}
INT  RequestParser(RtspRequest* rtsprequest)
{
	INT wI = 0;
	INT method_Type = -1;			//方法类型
	INT strIdx = 0;					//存储解析到当前request

	//	CHAR wordBuf[BUFFER_LEN - 1];	//存储解析出来的字符串
	//	CHAR isLineEnd;					//存储是否是行结尾标志
	//CHAR method[BUFFER_LEN];


	if (request[BUFFER_LEN - 1] == '1')
	{
		//解析Request Line
		method_Type = ParseRequestLine(rtsprequest, &strIdx);

		if (method_Type < 0)
		{
			return -1;
		}

		ParaseRequestHeader(rtsprequest, strIdx);

	}

	//return method_Type;
        memset(request,'0',100);
		return 1;
}


char *GetSessionId(char *sess)
{
	UNSIGNED sessionid;
	
	time_t t; 
    srand((unsigned) time(&t)); 
	sessionid= rand()%90000+10000;
	itoa(sessionid,sess,10);
	return sess;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -