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*/