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