live555峰哥的私房菜(五)-----MyRTSP主函数

本文按照(四)的规划建立了RTSP服务器的主函数。

//TcpSocket.h

#ifndef _TCPSOCKET_H__
#define _TCPSOCKET_H__
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netdb.h>      
#include <pthread.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>        
#include <unistd.h>       
#include <dirent.h>       
#include <limits.h>
#include <getopt.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <stddef.h>
#include<string>
#include<iostream>

using namespace std;

class CTcpSocket

{
public:
CTcpSocket(void);

virtual ~CTcpSocket(){NULL;};

int tcpCreate(const int port,const char* pszIpStr);

int tcpBind();

int tcpListen(const int iLisNum);

int tcpAccept();

int tcpConnect();

int tcpSend(int iSendFd,const char* pszSenBuf,int iSenBufLen);

int tcpRecv(int iRecFd,char*pszRecBuf,int iRecBufLen);

void tcpClose();

public:
    int iTcpSock;

private:

	sockaddr_in TcpAddr;

	sockaddr_in TcpClientAddr;

	socklen_t iAddLen;

};

#endif


 //TcpSocket.cpp

#include"TcpSocket.h"

CTcpSocket::CTcpSocket(void)
{
  iTcpSock=0;
}

int CTcpSocket::tcpCreate(const int port,const char* pszIpStr)
{
	   	  bzero(&TcpAddr,sizeof(TcpAddr));
	   	  TcpAddr.sin_family=AF_INET;
		if(pszIpStr!=NULL)
		{
			TcpAddr.sin_addr.s_addr=inet_addr(pszIpStr);
		}

		else
		{
			TcpAddr.sin_addr.s_addr=htonl(INADDR_ANY);
		}

		TcpAddr.sin_port=htons(port);
		iAddLen=sizeof(TcpAddr);
		iTcpSock=socket(AF_INET,SOCK_STREAM,0);
		return iTcpSock;
}

int  CTcpSocket::tcpBind()
{
int iBind=0;
iBind=bind(iTcpSock,(struct sockaddr*)&TcpAddr,sizeof(TcpAddr));
if(-1==iBind) 
{
 cout<<"bind error"<<endl;
exit(-1);
}

return iBind;
}

int CTcpSocket::tcpListen(const int iLisNUm)
{
return listen(iTcpSock,iLisNUm);
}

int CTcpSocket::tcpAccept()
{
	int iAccpet=0;
	iAddLen=sizeof(struct sockaddr_in);
	iAccpet=accept(iTcpSock,(struct sockaddr*)&TcpClientAddr,&iAddLen);
	if(-1==iAccpet)
	{
	cout<<"accpet error!"<<endl;
	exit(1);
	}
return iAccpet;
}

int CTcpSocket::tcpConnect()
{
int iConnect=connect(iTcpSock,(struct sockaddr*)&TcpAddr,iAddLen);
if(-1==iConnect)
{
cout<<"connect error"<<endl;
exit(-1);
}

return iConnect;
}

 
int CTcpSocket::tcpSend(int iSendFd,const char*pszSenBuf,int iSenBufLen)

{
int iSendNum=0;
iSendNum=write(iSendFd,pszSenBuf,iSenBufLen);
if(iSendNum!=iSenBufLen)
cout<<"sendNum!=senBufLen"<<endl;
return iSendNum;
}

int CTcpSocket::tcpRecv(int iRecFd,char* pszRecBuf,int iRecBufLen)
{
int iRecNum=0;
iRecNum=read(iRecFd,pszRecBuf,iRecBufLen);
return iRecNum;
}

void CTcpSocket::tcpClose()
{
close(iTcpSock);
}



 

//MyRtsp.h
#include "TcpSocket.h"

#define TURE 1

 

//MyRtsp.cpp

#include"MyRtsp.h"

void* RtspHandleFun(void *Fd);


int main()
{
	CTcpSocket TcpServer;
	TcpServer.tcpCreate(8554,NULL);
	TcpServer.tcpBind();
	TcpServer.tcpListen(10);
	int iClientSocketFd=0;
	int iPthreadNum=0;
	pthread_t a_thread[300];

	
	while(TURE)
	{
		iClientSocketFd=TcpServer.tcpAccept();
		//创建分线程
		pthread_create(&a_thread[iPthreadNum++],NULL,RtspHandleFun,&iClientSocketFd);
	}

	return 0;
}

void* RtspHandleFun(void *Fd)
{
	int iClientFd=*(int *)Fd;
	char pszBuffer[512]={0};	
	char pszParseBuffer[128]={0};	


	CRtspClientSession RtspClientSession;
	int iRunning=1;

while(iRunning)
{
	read(iClientFd,pszBuffer,sizeof(pszBuffer));
	printf("%s\n",pszBuffer);

	int iRet=RtspClientSession.ParseRtspRequestString(pszBuffer,pszParseBuffer);

//"OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER";
	switch(iRet)
	{
		case 1:
			pszBuffer=RtspClientSession.handleCmdOptions(pszParseBuffer);
			break;
		case 2:
			pszBuffer=RtspClientSession.handleCmdDescribe(pszParseBuffer);
			break;
		case 3:
			pszBuffer=RtspClientSession.handleCmdSetup(pszParseBuffer);
			break;
		case 4:
			pszBuffer=RtspClientSession.handleCmdTeardown(pszParseBuffer);
			break;
		case 5:
			pszBuffer=RtspClientSession.handleCmdPlay(pszParseBuffer);
			break;
		case 6:
			pszBuffer=RtspClientSession.handleCmdPause(pszParseBuffer);
			break;
		case 7:
			pszBuffer=RtspClientSession.handleCmdGetParameter(pszParseBuffer);
			break;
		case 8:
			pszBuffer=RtspClientSession.handleCmdSetParameter(pszParseBuffer);
			break;		
		default:
			printf("error,unknown methods!!\n");
			iRunning=0;
			break;
	}
	
	write(iClientFd,pszBuffer,sizeof(pszBuffer));
	
}
	
}





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值