www.pudn.com > Net_apps.rar > UdpServer.c
//*************************************************************
// Copyright 2003 Service & Quality Technology CO., LTD.
// ALL RIGHTS RESERVED.
// This software is provided under license and contains proprietary
// and confidential material which is the property of SQ tech.
//
// FileName : UdpServer.c
// Description : test send function
// Reversion : 0.1 ,Date : 2004/03/18 ,Author : gofly
// Comment : first implementation
//
//*************************************************************
#include "opt.h"
#if AUDIO_OPEN
#include "..\include\L3\net_apps\httpd\HttpServer.h"
#include "..\include\L2\system\pcm_adpcm.h"
#include "..\include\L3\net_apps\TurnData.h"
INT8U huge USendBuf[UDP_MAX_SEND_BUFF]; // Dynamic html Max size
INT8U huge URecvBuf[UDP_MAX_RECV_BUFF]; // http request Max size
TUdpCtrlBlack UGtHCB;
OS_EVENT *AudioEvenSem;
int count=0;
//INT8U huge *p=&Audiotst;
extern INT8U Audioflag;
//***********************************************
// HttpThread()
// Description :
// Parameters :
// Returns :
//***********************************************
void UdpAudioThread(void *data)
{
TUdpCtrlBlack *ptHCB = &UGtHCB;
INT8U *ServerSocket = data;
*ServerSocket = UdpAudioInit((void*)ptHCB);
AudioEvenSem = (OS_EVENT*)OSSemCreate(0);
while(2)
{
//if (!Audioflag)
//{
// OSSemPend(AudioEvenSem, 0, &ucErr);
//
//}
//while(Audioflag)
//{
//===========================================================================//
// SELECT which socket can recv & send
//===========================================================================//
UdpAudioSelect((void*)ptHCB);
//} /*while(1)*/
//OSTimeDlyHMSM(0, 0, 1 , 0);
}
}
//***********************************************
// UdpAudioSelect()
// Description :
// Parameters :
// Returns :
//***********************************************
INT8U UdpAudioSelect( void *data )
{
INT8U ucErr;
struct sockaddr cliaddr;
INT8U clilen;
TUdpCtrlBlack *ptHCB = data ;
int len,rc, cliLen;
struct sockaddr_in cliAddr;
ADPCM_BUF adpcmbuf;
INT8U tmp[10];
/* receive message */
ptHCB->SockRecvBuf[0]=0x00;
cliLen = sizeof(cliAddr);
len = recvfrom(ptHCB->Sock, ptHCB->SockRecvBuf, sizeof(URecvBuf), 0,
(struct sockaddr *) &cliAddr, &cliLen);
if(len>0)
{
//printf("from %s:UDP%u : %s \n",
//inet_ntoa(cliAddr.sin_addr.s_addr),
//ntohs(cliAddr.sin_port),ptHCB->SockRecvBuf);
if (!strncmp(ptHCB->SockRecvBuf,"AUDIO",5))
{
if (!Audioflag)
{
memcpy(USendBuf,"STOP\0x00",5);
sendto(ptHCB->Sock,USendBuf,6 , 0, (struct sockaddr *)&cliAddr, cliLen);
OSTimeDlyHMSM(0, 0, 0 , 500);
}
else
{
audio_voice_get(&adpcmbuf);
memcpy(USendBuf,&adpcmbuf.adpcm_tmval.tv_sec,sizeof(adpcmbuf.adpcm_tmval.tv_sec)+sizeof(adpcmbuf.adpcm_tmval.tv_msec));
//memcpy(USendBuf+sizeof(adpcmbuf.adpcm_tmval.tv_sec),&adpcmbuf.adpcm_tmval.tv_msec,sizeof(adpcmbuf.adpcm_tmval.tv_msec));
memcpy(USendBuf+sizeof(adpcmbuf.adpcm_tmval),adpcmbuf.adpcm_data,adpcmbuf.adpcm_data_size);
rc = sendto(ptHCB->Sock,USendBuf, adpcmbuf.adpcm_data_size+sizeof(adpcmbuf.adpcm_tmval), 0, (struct sockaddr *)&cliAddr, cliLen);
}
//sprintf(tmp,inet_ntoa(cliAddr.sin_addr.s_addr));
//rc = sendto(ptHCB->Sock,adpcmbuf.adpcm_data, adpcmbuf.adpcm_data_size, 0, (struct sockaddr *)&cliAddr, cliLen);
//if (count>8){p = Audiotst; count=0;}
//rc = sendto(ptHCB->Sock,p,1024,0, (struct sockaddr *)&cliAddr, cliLen);
//count++;
//p+=1024;
//if (rc < 0){printf("can not send data\n");}
}
//by linyi 20050725
else if(!strncmp(ptHCB->SockRecvBuf,"GETPARAMS",9))
{
INT8U sTemp[20]="";
INT8U sMsg[40]="";
//?Video=y&Audio=n&Cookie=RootCookie00000&webcamID==001122334455&UID=0&MDPC=n
memset(USendBuf,0x00,sizeof(USendBuf));
//video
TurnData("VIDEO_PLAY",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"Video=%s",sTemp);
strcat(USendBuf,sMsg);
//audio
TurnData("AUDIO_",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&Audio=%s",sTemp);
strcat(USendBuf,sMsg);
//cookie
TurnData("COOKIE",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&Cookie=%s",sTemp);
strcat(USendBuf,sMsg);
//webcamid
TurnData("WEBCAMID",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&webcamID=%s",sTemp);
strcat(USendBuf,sMsg);
//uid
TurnData("UID",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&UID=%s",sTemp);
strcat(USendBuf,sMsg);
//mdpc
TurnData("EventT_Det_MDPC",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&MDPC=%s",sTemp);
strcat(USendBuf,sMsg);
//webcamname
TurnData("WEBCAMNAME",sTemp,sizeof(sTemp),ROOT);
sprintf(sMsg,"&CamName=%s",sTemp);
strcat(USendBuf,sMsg);
//send params
sendto(ptHCB->Sock,USendBuf,strlen(USendBuf)+1 , 0, (struct sockaddr *)&cliAddr, cliLen);
}
//end by linyi
}
else
{
//OSSemPend(AudioEvenSem, 0, &ucErr);
OSTimeDlyHMSM(0, 0, 0 , 500);
}
}
//***********************************************
// UdpAudioInit()
// Description : init TUdpCtrlBlack
// Creat Server Socket
// Parameters :
// Returns : sucess 1 - UDP_MAX_SOCKET
// fail INVALID_SOCKET
//***********************************************
INT8S UdpAudioInit(void *data)
{
INT8U i;
struct sockaddr_in Seversa;
INT8U sock;
TUdpCtrlBlack *ptHCB = data;
INT16U port;
//==========================================================
// init TUdpCtrlBlack
//==========================================================
//for(i = 0; i < UDP_MAX_SOCKET; i++)
//{
UdpAudioClearHCBByIndex(data, 0);
//}
//==========================================================
// Open Socket (server)
//==========================================================
if( INVALID_SOCKET == ( sock = socket(0, SOCK_DGRAM, 0) ) )
{
return INVALID_SOCKET;
}
//===========================================================
// BIND Socket (server)
//===========================================================
port = 1500;
Seversa.sin_family = AF_INET;
Seversa.sin_addr.s_addr = htonl(INADDR_ANY);
Seversa.sin_port = htons( port) ;
if(bind(sock,&Seversa,0) == INVALID_SOCKET)
{
close(sock);
return INVALID_SOCKET;
}
ptHCB->Sock = sock;
return sock;
}
//***********************************************
// UdpAudioClearHCBByIndex()
// Description : init individual HCB
// Parameters :
// Returns : sucess 0
// fail INVALID_SOCKET
//***********************************************
INT8S UdpAudioClearHCBByIndex(void *data, INT8U index)
{
TUdpCtrlBlack *ptHCB = (INT8U *)data ;
ptHCB->Stat = UDP_STOP;
ptHCB->Sock = INVALID_SOCKET;
ptHCB->SockSendBuf = USendBuf;
ptHCB->SockRecvBuf = URecvBuf;
ptHCB->Order = NULL;
ptHCB->FileType = FILE_TYPE_NULL;
ptHCB->TotalLen = 0;
ptHCB->SendLen = 0;
ptHCB->RecvLen = 0;
ptHCB->UID = OTHER;
ptHCB->File = NULL;
ptHCB->ExHttpHead[0] = 0x00;
ptHCB->PID = 0xff;
ptHCB->AccessTime = 0;
ptHCB->send_jpg.jpg_file = NULL;
return -1;
}
//***********************************************
//void UdpAudioCloseConnect(void *data, INT8U index)
// Description : close UdpAudio clinet socket
// Parameters :
// Returns :
//
//***********************************************
void UdpAudioCloseConnect(void *data, INT8U index)
{
char Msg[256];
TUdpCtrlBlack *ptHCB = data ;
close(ptHCB->Sock);
UdpAudioClearHCBByIndex((void*)data, 0);
}
//***********************************************
//void UdpAudioApi
// Description :
// Parameters :
// Returns :
//
//***********************************************
void UdpAudioApi()
{
OSSemPost(AudioEvenSem);
}
#endif /*HTTP_OPEN*/