www.pudn.com > Net_apps.rar > HttpServerTestSendPerformance.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     : HttpServerTestSendPerformance.c 
// Description  : test send  function 
// Reversion    : 0.1 ,Date : 2004/03/18 ,Author  : gofly 
//                Comment : first implementation 
// 
//************************************************************* 
#include "opt.h" 
#if HTTP_OPEN 
#include "..\net\proj\unixsim\net_apps\httpd\HttpServer.h" 
INT8U  huge GSendBuf[HTTP_MAX_SOCKET][HTTP_MAX_SEND_BUFF];     //  Dynamic  html Max size 
INT8U  huge GRecvBuf[HTTP_MAX_SOCKET][HTTP_MAX_RECV_BUFF];     //  http     request Max size 
THttpCtrlBlack  GtHCB; 
//*********************************************** 
// HttpThread() 
// Description  : 
// Parameters   : 
// Returns      : 
//*********************************************** 
void HttpThread(void *data) 
{ 
    THttpCtrlBlack *ptHCB   = &GtHCB; 
    INT8U *ServerSocket     = data; 
 /* 
    //----- test 
    INT8U sock; 
    INT8U i; 
    for(i = 0; i< 255; i++) 
    { 
     sock =  socket(0, SOCK_STREAM, 0); 
        if(i == 4) 
        { 
            sock = i; 
        } 
 
    } 
  */ 
    //------------- 
 
 
 
    *ServerSocket = HttpInit((void*)ptHCB); 
 
    ASSERT_EX1(HTTP_DEBUG, "HTTP INIT ERR ", *ServerSocket !=  INVALID_SOCKET); 
    SHOW_EX1(HTTP_DEBUG, "SERVICE HTTPD START \n"); 
    while(1) 
    { 
 
	//===========================================================================// 
	//     SELECT which socket can recv  & send 
	//===========================================================================// 
         HttpSelect((void*)ptHCB); 
 
    }  /*while(1)*/ 
 
} 
//*********************************************** 
// HttpAccept() 
// Description  :   fine the empty sock and 
//                  when sock enable init sock param 
// Parameters   : 
// Returns      : 
//*********************************************** 
void HttpAccept(void *data) 
{ 
    INT8U  i; 
    INT8U  count; 
    INT8U *ServerSocket =  data; 
    INT8U  Msg[256]; 
    INT16S                  RemoteDataSize; 
    INT32U                *pIpAddress; 
    INT8U                 *pIpaddressStr; 
    struct sockaddr_in     Seversa; 
    struct sockaddr        RemoteData; 
 
    THttpCtrlBlack  *ptHCB         =  &GtHCB ; 
 
 
    count           =   0; 
    RemoteDataSize  =   sizeof(struct sockaddr); 
    while(1) 
    { 
        if(++count > 250)// ServerSocket init err 
        { 
            ASSERT_EX1(HTTP_DEBUG, "HTTP INIT ERR ACCEPT DESTORY", *ServerSocket !=  INVALID_SOCKET); 
        } 
 
        if(*ServerSocket != INVALID_SOCKET) 
        { 
            for(i = 0; i < HTTP_MAX_SOCKET; i++) 
            { 
                if(ptHCB->Stat[i] == HTTP_STOP) break;    // search empty 
            } 
            if(i == HTTP_MAX_SOCKET) 
            { 
                OSTimeDlyHMSM(0, 0, 0, 1); 
                continue; 
            } 
            ptHCB->Sock[i]          = accept(*ServerSocket,&Seversa,0); 
 
            getpeername(ptHCB->Sock[i], &RemoteData, &RemoteDataSize); 
            pIpAddress      = (INT32U)(RemoteData.sa_data + 2); 
            pIpaddressStr   =  inet_ntoa(*pIpAddress); 
            ptHCB->PID[i]   =  &ptHCB->Sock[i]; 
 
            if(HttpHostDeny(*pIpAddress)) 
            {//deny 
                close(ptHCB->Sock[i]); 
                HttpClearHCBByIndex((void*)ptHCB, i); 
                sprintf(Msg,"%s deny accept http server PID %d\n\x00", 
                         pIpaddressStr, *ptHCB->PID[i]); 
                SHOW_EX1(HTTP_DEBUG, Msg); 
            } 
            else 
            {//allow 
                ptHCB->AccessTime[i]    = OSTimeGet(); 
                ptHCB->Stat[i]          = HTTP_NEW; 
                sprintf(Msg,"%s allow accept http server PID %d\n\x00", 
                         pIpaddressStr, *ptHCB->PID[i]); 
                SHOW_EX1(HTTP_DEBUG, Msg); 
            } 
 
 
        } 
        else 
        { 
            OSTimeDlyHMSM(0, 0, 0, 500); 
        } 
 
    } 
} 
//*********************************************** 
// HttpInit() 
// Description  :   init THttpCtrlBlack 
//                  Creat Server Socket 
// Parameters   : 
// Returns      : sucess 1 - HTTP_MAX_SOCKET 
//                fail   INVALID_SOCKET 
//*********************************************** 
 
INT8S HttpInit(void *data) 
{ 
    INT8U                   i; 
    struct sockaddr_in      Seversa; 
    INT8U                   sock; 
    THttpCtrlBlack *ptHCB   =   data; 
 
 
//========================================================== 
//                init THttpCtrlBlack 
//========================================================== 
 
    for(i = 0; i < HTTP_MAX_SOCKET; i++) 
    { 
        HttpClearHCBByIndex(data, i); 
    } 
//========================================================== 
//                Open Socket (server) 
//========================================================== 
 
 	if( INVALID_SOCKET == ( sock =  socket(0, SOCK_STREAM, 0) ) ) 
    { 
        return   INVALID_SOCKET; 
 
	} 
//=========================================================== 
//               BIND Socket (server) 
//=========================================================== 
    Seversa.sin_port = htons( HttpPort()) ; 
 
    if(bind(sock,&Seversa,0) == INVALID_SOCKET) 
    { 
        close(sock); 
        return  INVALID_SOCKET; 
    } 
    if(listen(sock,0) == INVALID_SOCKET) 
    { 
        close(sock); 
        return  INVALID_SOCKET; 
    } 
 
   return sock; 
} 
 
//*********************************************** 
// HttpClearHCBByIndex() 
// Description  :   init individual HCB 
// Parameters   : 
// Returns      : sucess 0 
//                fail   INVALID_SOCKET 
//*********************************************** 
INT8S HttpClearHCBByIndex(void *data, INT8U index) 
{ 
    THttpCtrlBlack *ptHCB =  (INT8U *)data ; 
 
    ptHCB->Stat[index]          =   HTTP_STOP; 
    ptHCB->Sock[index]          =   INVALID_SOCKET; 
    ptHCB->SockSendBuf[index]   =   GSendBuf[index]; 
    ptHCB->SockRecvBuf[index]   =   GRecvBuf[index]; 
    ptHCB->Order[index]         =   NULL; 
    ptHCB->FileType[index]      =   FILE_TYPE_NULL; 
    ptHCB->TotalLen[index]      =   0; 
    ptHCB->SendLen[index]       =   0; 
    ptHCB->RecvLen[index]       =   0; 
    ptHCB->UID[index]           =   OTHER; 
    ptHCB->File[index]          =   NULL; 
 
 
 
    return -1; 
} 
//*********************************************** 
// HttpSelect() 
// Description  :  check recv send accept even 
// Parameters   : 
// Returns      : 
//*********************************************** 
INT8U HttpSelect( void *data) 
{ 
 
 
    THttpCtrlBlack *ptHCB    =    data ; 
    INT8U                   i; 
    INT8U                   Msg[256]; 
    INT8U                   count; 
    INT8U                   RecvDestory;// if recv data sol err set it 
    INT32S                  len; 
    fd_set                  readset; 
    fd_set                  writeset; 
 
    struct  timeval         timeout={1,0}; 
 
 
 
    RecvDestory = 0; 
    FD_ZERO(&readset); 
    FD_ZERO(&writeset); 
 
    for(i = 0, count = 0 ; i < HTTP_MAX_SOCKET; i++) 
    { 
    
 
        if(ptHCB->Sock[i] != INVALID_SOCKET) 
        { 
            if(ptHCB->Stat[i] == HTTP_NEW || ptHCB->Stat[i] == HTTP_RECV) 
            { 
                FD_SET(ptHCB->Sock[i], &readset); 
                count++; 
            } 
            else if(ptHCB->Stat[i] == HTTP_SEND) 
            { 
                FD_SET(ptHCB->Sock[i], &writeset); 
                count++; 
            } 
 
        } 
    } /*for(i = 0, count = 0 ; i < HTTP_MAX_SOCKET; i++)*/ 
 
    if(count == 0) 
    { 
      OSTimeDlyHMSM(0, 0, 0, 20); 
      return 1; 
 
    } 
 
    select(HTTP_MAX_SOCKET, &readset, &writeset, NULL,&timeout); 
 
    for(i = 0; i < HTTP_MAX_SOCKET; i++) 
    { 
    //==========================================================// 
    //     send  even 
    //==========================================================// 
        if(FD_ISSET(ptHCB->Sock[i], &writeset) ) 
        {//---- write send 
            ptHCB->AccessTime[i]    = OSTimeGet(); 
           #if 0 
               //-------- test send  Performance ----------// 
                ///*@@ 
                len = send(ptHCB->Sock[i] 
                    ,ptHCB->File[i] + ptHCB->SendLen[i] 
                    ,ptHCB->TotalLen[i] - ptHCB->SendLen[i] 
                    ,0); 
                ptHCB->SendLen[i] += len; 
 
                if(ptHCB->TotalLen[i] == ptHCB->SendLen[i]) 
                  ptHCB->SendLen[i] = 0; 
 
                //*/@@ 
          #else 
 
            len = send(ptHCB->Sock[i] 
                ,ptHCB->File[i] + ptHCB->SendLen[i] 
                ,ptHCB->TotalLen[i] - ptHCB->SendLen[i] 
                ,0); 
            ptHCB->SendLen[i] += len; 
          #endif 
            //SHOW_EX1(HTTP_DEBUG, "Send even \n"); 
        } /*if(FD_ISSET(ptHCB->Sock[i], &writeset) )*/ 
    //==========================================================// 
    //     recv even 
    //==========================================================// 
        else if(FD_ISSET(ptHCB->Sock[i], &readset) ) 
        {//----- read even 
            ptHCB->AccessTime[i]    = OSTimeGet(); 
            len = recv(ptHCB->Sock[i] 
                ,ptHCB->SockRecvBuf[i] + ptHCB->RecvLen[i] 
                ,sizeof(GRecvBuf)/HTTP_MAX_SOCKET - ptHCB->RecvLen[i] 
                ,0); 
    //----------------------------------------------------------// 
    //      recv  general    len > 0 
    //----------------------------------------------------------// 
            if(len > 0) 
            { 
                ptHCB->RecvLen[i] += len; 
            //--------check recv data--------------// 
                if(HttpRecvComplete(ptHCB, i) == HTTP_R_OK) 
                { 
                   // recv over||recv midway 
                } 
                else 
                { 
                    RecvDestory = 1;// to bring about recv destory 
                } 
 
            } 
    //----------------------------------------------------------// 
    //      recv destory      len <= 0 
    //----------------------------------------------------------// 
            if(RecvDestory || len <= 0 ) 
            { 
                if(len <= 0) 
                { 
                    sprintf(Msg, "remote close PID %d\n", *ptHCB->PID[i]); 
                } 
                else if(RecvDestory) 
                { 
                    sprintf(Msg, "RecvDestory close PID %d\n", *ptHCB->PID[i]); 
                } 
 
                close(ptHCB->Sock[i]); 
                SHOW_EX1(HTTP_DEBUG, Msg); 
                HttpClearHCBByIndex((void*)data, i); 
            } 
 
 
 
        } /* if(FD_ISSET(ptHCB->Sock[i], &readset) )*/ 
        else  if(ptHCB->Sock[i] != INVALID_SOCKET) 
    //==========================================================// 
    //    check   timeout 
    //==========================================================// 
        {// socket open but have no active  check can  sock access time 
 
           if(OSTimeGet() - ptHCB->AccessTime[i]   > HTTP_SOCK_IDLE_TIMEOUT) 
           { 
               sprintf(Msg, "timeout server close  PID %d\n", *ptHCB->PID[i]); 
               close(ptHCB->Sock[i]); 
               SHOW_EX1(HTTP_DEBUG, Msg); 
               HttpClearHCBByIndex((void*)data, i); 
 
           } 
 
 
        } 
 
    }  /*for(i = 0; i < HTTP_MAX_SOCKET; i++)*/ 
 
 
 
    return 0; 
} 
//*********************************************** 
// HttpPort() 
// Description  :   return http port 
// Parameters   : 
// Returns      : http port 
//*********************************************** 
INT8U HttpPort() 
{ 
 
 
    return 80;// will change from eeprom 
} 
 
#endif /*HTTP_OPEN*/