📄 restdemo.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 + -