亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? srvctrl.c

?? Web服務(wù)器V1.01,Win Socket底層開發(fā)
?? C
字號(hào):
/********************************************************************
** WebSrv -- SrvCtrl.c
**
** Steven Lee	2002.11
********************************************************************/

#include <Windows.h>
#include <string.h>
#include <TCHAR.h>
#include <stdio.h>

#ifdef	_DEBUG
//#define	_LOG_USERS
//#define	_DEBUG_VIEW_REQUEST
//#define	_DEBUG_VIEW_RESPONSE
//#define	_DEBUG_VIEW_RESHEAD
#endif

#include "SrvCtrl.h"
#include "WinSockEx.h"
#include "WebSrvDefs.h"

#define	MAX_MSG_NUM		16

SERVERINFOS		g_server;							//server messages
DWORD			g_dwMaxUsers;						//max users number
DWORD			g_dwCurUsers = 0;					//current users number
TCHAR			g_szWebRoot[MAX_PATH];				//server root directory
HANDLE			g_hLogFile = INVALID_HANDLE_VALUE;	//server logfile

void InitSrvCtrl()
{
	g_server.bTerminate = FALSE;
	g_server.hSrvSocket = INVALID_SOCKET;
	g_server.nPort = DEFAULT_SRV_PORT;
	g_server.hSrvThread = NULL;

	g_dwMaxUsers = DEFAULT_MAX_USERS;
	g_dwCurUsers = 0;

	_tcscpy( g_szWebRoot,_T(".\\wwwroot") );

	g_hLogFile = CreateFile( _T(".\\WebSrv.log"),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,NULL );
}

void ReleaseSrvCtrl()
{
	if( g_hLogFile != INVALID_HANDLE_VALUE )
		CloseHandle( g_hLogFile );
}

BOOL WINAPI ConsoleCtrlEvent( DWORD dwCtrlType )
{
	switch( dwCtrlType )
	{
		case CTRL_C_EVENT:
		case CTRL_BREAK_EVENT:
		case CTRL_CLOSE_EVENT:
		case CTRL_LOGOFF_EVENT:
		case CTRL_SHUTDOWN_EVENT:
			StopServer(5000);
			ReleaseWinSocket();
			ReleaseSrvCtrl();
			break;
	}
	return TRUE;
}

BOOL StartServer(LPTSTR lpszError)
{
	DWORD		dwThrdID;

	g_server.hSrvSocket = CreateSrvSocket( g_server.nPort,lpszError );
	if( g_server.hSrvSocket == INVALID_SOCKET )
		return FALSE;

	g_server.hSrvThread = CreateThread( NULL,0,(LPTHREAD_START_ROUTINE)SrvThrdProc,
		(LPVOID)&g_server,0,&dwThrdID );
	if( g_server.hSrvThread == NULL )
	{
		if( lpszError != NULL )
			_stprintf( lpszError,_T("create server thread failed\n") );
		CloseSrvSocket( g_server.hSrvSocket );

		return FALSE;
	}

	g_server.bTerminate = FALSE;

	LogServerMessage( _T("Server Started"),INVALID_SOCKET );

	return TRUE;
}

BOOL StopServer(DWORD dwTimeOut)
{
	g_server.bTerminate = TRUE;

	if( g_server.hSrvThread != NULL )
	{
		if( WaitForSingleObject( g_server.hSrvThread,dwTimeOut ) != WAIT_OBJECT_0 )
		{
			TerminateThread( g_server.hSrvThread,1 );
			
			return FALSE;
		}
		
		CloseHandle( g_server.hSrvThread );
		g_server.hSrvThread = NULL;
	}
	
	LogServerMessage( _T("Server Stopped"),INVALID_SOCKET );

	return TRUE;
}

DWORD WINAPI SrvThrdProc(LPVOID lpParam)
{
	LPSERVERINFOS		lpSrvInfos = (LPSERVERINFOS)lpParam;
	fd_set				fds;
	struct timeval		timeout;
	int					nErr;
	SOCKET				hSocket;
	struct sockaddr_in	client;
	int					nAddrLen = sizeof(struct sockaddr_in);
	HANDLE				hClientThrd;
	DWORD				dwCltThrdId;

	timeout.tv_sec = 0;
	timeout.tv_usec = 500;

	while( !lpSrvInfos->bTerminate )
	{
		FD_ZERO(&fds);
		FD_SET(lpSrvInfos->hSrvSocket,&fds);

		nErr = select( lpSrvInfos->hSrvSocket + 1,&fds,NULL,NULL,&timeout );
		if( nErr == WSAEINVAL )
			continue;
		else if( nErr == SOCKET_ERROR )
			return 1;

		if( FD_ISSET(lpSrvInfos->hSrvSocket,&fds) )
		{
			hSocket = accept( lpSrvInfos->hSrvSocket,(struct sockaddr*)&client,&nAddrLen );
			if( hSocket == INVALID_SOCKET )
			{
				_tprintf( _T("socket accept failed!existing...\n") );
				break;
			}

			if( (g_dwMaxUsers > 0) && (g_dwCurUsers >= g_dwMaxUsers) )
			{
				closesocket( hSocket );
				continue;
			}

			hClientThrd = CreateThread( NULL,0,(LPTHREAD_START_ROUTINE)CltThrdProc,
				(LPVOID)hSocket,0,&dwCltThrdId );
			if( hClientThrd == NULL )
			{
				_tprintf( _T("cannot create client thread.\n") );
				break;
			}

			CloseHandle( hClientThrd );
		}
	}
	
	TerminateSrvSocket( lpSrvInfos->hSrvSocket );
	lpSrvInfos->hSrvSocket = INVALID_SOCKET;
	lpSrvInfos->bTerminate = TRUE;
	Sleep(1000);
	
	return 0;
}

DWORD WINAPI CltThrdProc(LPVOID lpParam)
{
	SOCKET			hSocket = (SOCKET)lpParam;
	fd_set			fds;
	int				nErr;
	int				nRecvLen;
	struct timeval	timeout;

	TCHAR			szRecvBuf[MAX_SOCKET_BUF];

	timeout.tv_sec = 0;
	timeout.tv_usec = 1000;

	g_dwCurUsers++;

#ifdef	_LOG_USERS
	LogServerMessage( _T("User Log In"),hSocket );
#endif

	while( !g_server.bTerminate )
	{
		FD_ZERO(&fds);
		FD_SET(hSocket,&fds);

		nErr = select( hSocket + 1,&fds,NULL,NULL,&timeout );
		if( nErr == WSAEINVAL )
			continue;
		else if( nErr == SOCKET_ERROR )
			break;

		if( FD_ISSET(hSocket,&fds) )
		{
			ZeroMemory( szRecvBuf,MAX_SOCKET_BUF );
			nRecvLen = ReadFromSocket( hSocket,szRecvBuf,
				MAX_SOCKET_BUF * sizeof(TCHAR),NULL );
			if( nRecvLen <= 0 )
				break;
			
#ifdef	_DEBUG_VIEW_REQUEST
			printf( "\nRequest Message:\n" );
			_tprintf( szRecvBuf );
#endif
			
			if( !SendSrvResponse( hSocket,szRecvBuf ) )
				break;
		}
	}

#ifdef	_LOG_USERS
	LogServerMessage( _T("User Log Out"),hSocket );
#endif

	closesocket( hSocket );

	g_dwCurUsers--;
	
	return 0;
}

BOOL ServerRunning()
{
	return !g_server.bTerminate;
}

UINT SetServerPort(UINT nPort)
{
	if( (g_server.hSrvSocket == INVALID_SOCKET) && (nPort > 0) )
		g_server.nPort = nPort;

	return g_server.nPort;
}

int SetMaxUsers(int dwMax)
{
	if( dwMax > 0 )
		g_dwMaxUsers = dwMax;
	
	return g_dwMaxUsers;
}

BOOL GetHTTPFileName(LPCTSTR lpszHeader,LPSTR lpszHTTPFile,SOCKET s)
{
	LPSTR		lpStart,lpEnd;
	TCHAR		lpStrTmp[MAX_PATH];
	int			i;

	if( _tcsnicmp( lpszHeader,_T("Get"),3 ) != 0 )
	{
		LogServerMessage( _T("Unknown HTTP Message Format."),s );
		return FALSE;
	}

	lpStart = _tcschr( lpszHeader,_T('/') );
	lpEnd = _tcschr( lpStart,_T(' ') );
	ZeroMemory( lpStrTmp,MAX_PATH * sizeof(TCHAR) );
	_tcsncpy( lpStrTmp,lpStart,lpEnd - lpStart );
		
	if( _tcslen( lpStrTmp ) == 1 )
		_stprintf( lpszHTTPFile,_T("%s\\Index.html"),g_szWebRoot );
	else
	{
		for( i=0;i<(lpEnd - lpStart);i++ )
			if( lpStrTmp[i] == _T('/') )
				lpStrTmp[i] = _T('\\');
			
		_stprintf( lpszHTTPFile,_T("%s%s"),g_szWebRoot,lpStrTmp );
	}

	return TRUE;
}

BOOL GetHTTPVersion(LPCTSTR lpszHeader,int* lpnMajor,int* lpnMinor)
{
	LPTSTR		lpStart,lpEnd;
	TCHAR		szNumber[10];

	lpStart = _tcsrchr( lpszHeader,_T('/') );
	lpEnd = _tcsrchr( lpszHeader,_T('.') );

	if( lpStart && lpEnd )
	{
		lpStart++;
		ZeroMemory( szNumber,10 * sizeof(TCHAR) );
		_tcsncpy( szNumber,lpStart,lpEnd - lpStart );
		*lpnMajor = atoi( szNumber );
		lpEnd++;
		*lpnMinor = atoi( lpEnd );

		return TRUE;
	}

	return FALSE;
}

BOOL ReqHTTPFileExists(LPTSTR lpszFile)
{
	LPTSTR		lpExt;

	if( GetFileAttributes(lpszFile) != (DWORD)-1 )
		return TRUE;

	lpExt = _tcsrchr( lpszFile,_T('.') );
	if( lpExt != NULL )
	{
		if( _tcsicmp(lpExt,_T(".htm")) == 0 )
			_tcscat( lpszFile,_T("l") );
		else if( (_tcsicmp(lpExt,_T(".html")) == 0) && (_tcslen(lpszFile) > 0) )
			lpszFile[_tcslen(lpszFile) - 1] = _T('\0');

		return GetFileAttributes(lpszFile) != (DWORD)-1;
	}

	return FALSE;
}

BOOL SendSrvResponse(SOCKET hSocket,LPTSTR pszRecv)
{
	const TCHAR	seps[] = _T("\r\n");
	TCHAR		szResponse[MAX_SOCKET_BUF];
	TCHAR		szHTTPFile[MAX_PATH];
	PCHAR		strTok;
	BOOL		bFileOK = FALSE;
	HANDLE		hFile;
	DWORD		dwFileSize,dwToRead,dwRead;
	HTTPHEADER	httpHead;
	int			nVerMajor,nVerMinor;

	strTok = _tcstok( pszRecv,seps );
	if( (!GetHTTPFileName( strTok,szHTTPFile,hSocket )) 
		|| (!GetHTTPVersion(strTok,&nVerMajor,&nVerMinor) ) )
		httpHead.httpRes = RES_BADREQ;
	else
	{
		if( !HTTPVersionSupport( nVerMajor,nVerMinor ) )
			httpHead.httpRes = RES_NOTSUPPORT;
		else if( !ReqHTTPFileExists( szHTTPFile ) )
			httpHead.httpRes = RES_NOTFOUND;
		else
		{
			httpHead.httpRes = RES_OK;
			bFileOK = TRUE;
		}
	}

	if( bFileOK )
	{
		GetContentType( szHTTPFile,httpHead.szContentType );
		hFile = CreateFile( szHTTPFile,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,
			NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );
		if( hFile == INVALID_HANDLE_VALUE )
			return FALSE;
		dwFileSize = GetFileSize( hFile,NULL );
		if( dwFileSize == INVALID_FILE_SIZE )
		{
			CloseHandle( hFile );
			return FALSE;
		}
		httpHead.dwData = dwFileSize;
		
		FillHTTPResHeader(szResponse,MAX_SOCKET_BUF,&httpHead);
		SendToSocket( hSocket,szResponse,_tcslen(szResponse) * sizeof(TCHAR),NULL );
		
		dwToRead = MAX_SOCKET_BUF;
		while( dwFileSize > 0 )
		{
			ZeroMemory( szResponse,MAX_SOCKET_BUF * sizeof(TCHAR) );
			if( !ReadFile( hFile,szResponse,dwToRead * sizeof(TCHAR),&dwRead,NULL ) )
			{
				LogServerMessage( _T("Error when read file."),INVALID_SOCKET );
				CloseHandle( hFile );
				return FALSE;
			}
			SendToSocket( hSocket,szResponse,dwRead,NULL );

			dwFileSize -= dwRead;
		}

		CloseHandle( hFile );
	}
	else
	{
		if( FillHTTPResHeader( szResponse,MAX_SOCKET_BUF,&httpHead ) > 0 )
			SendToSocket( hSocket,szResponse,strlen(szResponse),NULL );
	}

#ifdef	_DEBUG_VIEW_RESPONSE
	printf( "\nResponse Message:\n" );
	printf( szResponse );
	printf( "\n" );
#endif
	
	return FALSE;
}

DWORD FillHTTPResHeader(LPTSTR lpszResponse,int nSize,LPHTTPHEADER lpHeader)
{
	static const TCHAR* lpcsResMsg[] = {
		_T("200 OK\r\n"),
		_T("301 Moved Permanently\r\n"),
		_T("400 Bad Request\r\n"),
		_T("404 Not Found\r\n"),
		_T("505 HTTP Version Not Supported\r\n")
	};

	TCHAR	szBuffer[MAX_PATH];
	
	ZeroMemory( lpszResponse,nSize * sizeof(TCHAR) );
	_tcscpy( lpszResponse,_T("HTTP/1.1 ") );
	_tcscat( lpszResponse,lpcsResMsg[lpHeader->httpRes] );
	_tcscat( lpszResponse,_T("Steven Lee--WebSrv/1.01\r\n") );
	_tcscat( lpszResponse,_T("Connection: close\r\n") );

	if( lpHeader->httpRes == RES_OK )
	{
		_tcscat( lpszResponse,_T("Accept-Ranges: bytes\r\n") );
		_stprintf( szBuffer,_T("Content-Length: %d\r\n"),lpHeader->dwData );
		_tcscat( lpszResponse,szBuffer );
		_stprintf( szBuffer,_T("Content-Type: %s\r\n\r\n"),lpHeader->szContentType );
		_tcscat( lpszResponse,szBuffer );
	}

#ifdef	_DEBUG_VIEW_RESHEAD
	_tprintf( _T("%s\n"),lpszResponse );
#endif
	
	return _tcslen( lpszResponse );
}

#define	N_CONTENT_TYPE	7

void GetContentType(LPCTSTR lpszReqFile,LPTSTR lpszType)
{
	static const TCHAR* lpcsType[N_CONTENT_TYPE * 2] = {
		_T("htm"),_T("text/html"),
		_T("html"),_T("text/html"),
		_T("txt"),_T("text/html"),
		_T("jpg"),_T("image/jpeg"),
		_T("bmp"),_T("image/bitmap"),
		_T("gif"),_T("image/gif"),
		_T("swf"),_T("application/x-shockwave-flash")
	};
	
	int		i;
	LPTSTR	lpszExtPos = _tcsrchr( lpszReqFile,_T('.') );

	_tcscpy( lpszType,_T("*/*") );
	lpszExtPos++;
	for(i=0;i<N_CONTENT_TYPE;i++)
		if( _tcsicmp(lpszExtPos,lpcsType[i * 2]) == 0 )
		{
			_tcscpy( lpszType,lpcsType[i * 2 + 1] );
			break;
		}
}

const DWORD GetUsersNumber()
{
	return g_dwCurUsers;
}

void LogServerMessage(LPCTSTR szLog,SOCKET s)
{
	TCHAR				szBuffer[MAX_PATH];
	SYSTEMTIME			st;
	TCHAR				szIP[20];
	DWORD				dwWritten;
	
	if( g_hLogFile == INVALID_HANDLE_VALUE )
		return;

	GetLocalTime( &st );
	_stprintf( szBuffer,_T("[%d:%d:%d-%d]--"),st.wHour,
		st.wMinute,st.wSecond,st.wMilliseconds );

	_tcscat( szBuffer,szLog );

	if( s != INVALID_SOCKET )
	{
		if( GetSocketIP( s,szIP,20 * sizeof(TCHAR) ) )
		{
			_tcscat( szBuffer,_T("--From ") );
			_tcscat( szBuffer,szIP );
		}
	}

	_tcscat( szBuffer,_T("\r\n") );

	WriteFile( g_hLogFile,szBuffer,_tcslen(szBuffer) * sizeof(TCHAR),&dwWritten,NULL );
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美猛男gaygay网站| 久久久久成人黄色影片| 97久久人人超碰| 成人毛片在线观看| www.av精品| 91在线视频官网| 91美女在线视频| 色欧美88888久久久久久影院| 成人午夜在线视频| gogogo免费视频观看亚洲一| 成人免费视频caoporn| 成人午夜视频免费看| 成人av电影在线观看| 97久久精品人人做人人爽50路| www.激情成人| 91久久国产综合久久| 欧美日韩一二三区| 5566中文字幕一区二区电影| 欧美一区二区视频在线观看 | 欧美不卡一区二区三区| 欧美va亚洲va| 中文字幕免费在线观看视频一区| 中文av一区特黄| 亚洲男同1069视频| 图片区小说区区亚洲影院| 日本va欧美va瓶| 国产一区二区h| av在线播放一区二区三区| 色婷婷综合激情| 欧美一区二区免费视频| 久久综合丝袜日本网| 国产精品国产a| 亚洲国产精品自拍| 久久99精品久久久久久| 国产成人自拍网| 色综合久久99| 日韩欧美一二三区| 国产传媒日韩欧美成人| 粉嫩嫩av羞羞动漫久久久| 91丝袜国产在线播放| 欧美亚一区二区| 欧美videos中文字幕| 中文字幕一区二区不卡| 亚洲一区二区影院| 国产一区二区网址| 欧美色电影在线| 精品99999| 亚洲乱码国产乱码精品精小说| 日韩一区精品字幕| 成人免费毛片aaaaa**| 在线精品视频免费播放| 日韩精品一区二区三区四区 | 国产精品免费aⅴ片在线观看| 一区二区在线观看免费视频播放| 美女国产一区二区| 色狠狠av一区二区三区| 欧美成人在线直播| 亚洲综合自拍偷拍| 国产成人啪午夜精品网站男同| 91色婷婷久久久久合中文| 日韩一区二区免费在线电影| 国产精品无码永久免费888| 天天色 色综合| www.亚洲人| 久久综合999| 天天亚洲美女在线视频| 99久久er热在这里只有精品66| 欧美一二三区在线| 一区二区三区四区在线免费观看| 国产最新精品精品你懂的| 欧美日韩国产一级二级| 中文字幕在线播放不卡一区| 美女脱光内衣内裤视频久久网站 | 欧美影片第一页| 国产欧美日韩在线看| 男人的天堂亚洲一区| 日本韩国欧美国产| 亚洲欧洲国产日韩| 国产一区二区三区最好精华液| 欧美高清性hdvideosex| 亚洲视频电影在线| 成人福利电影精品一区二区在线观看| 91精品国产色综合久久不卡电影| 一区二区三区日本| 成人avav在线| 国产欧美日产一区| 国产成人精品免费一区二区| 日韩免费视频一区| 美国毛片一区二区| 日韩一区二区三| 日韩不卡手机在线v区| 欧美图区在线视频| 亚洲女同ⅹxx女同tv| 99精品久久免费看蜜臀剧情介绍| 久久久久亚洲蜜桃| 国产伦精一区二区三区| 2020日本不卡一区二区视频| 麻豆精品久久久| 日韩欧美一区电影| 日韩国产精品久久久久久亚洲| 欧美亚洲精品一区| 亚洲一区二区在线视频| 欧日韩精品视频| 亚洲成人资源在线| 欧美日韩一区二区在线视频| 亚洲一区二区在线免费看| 在线观看日韩一区| 亚洲国产一二三| 欧美午夜电影网| 日韩高清在线不卡| 日韩一二三区视频| 国产一区视频导航| 国产清纯白嫩初高生在线观看91 | 26uuu欧美| 国产白丝网站精品污在线入口| 国产欧美日韩激情| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 成人黄色片在线观看| 日韩理论电影院| 色婷婷亚洲综合| 天天操天天干天天综合网| 日韩精品一区二| 国产激情偷乱视频一区二区三区 | 美腿丝袜在线亚洲一区| 久久精品一区四区| 99麻豆久久久国产精品免费| 亚洲精品视频在线观看免费| 欧美日韩在线三级| 激情综合色综合久久综合| 久久久久久**毛片大全| av不卡在线播放| 亚洲国产精品视频| 精品久久久久99| 91网页版在线| 日本在线不卡视频| 国产午夜精品一区二区三区视频 | 中文字幕二三区不卡| 一本大道av伊人久久综合| 视频一区国产视频| 国产清纯美女被跳蛋高潮一区二区久久w| 99麻豆久久久国产精品免费| 亚洲图片欧美综合| 久久―日本道色综合久久| 97aⅴ精品视频一二三区| 日韩精品一二三| 国产精品美女一区二区| 欧美日韩三级视频| 国产精品一区一区| 亚洲自拍偷拍欧美| 久久先锋影音av| 色屁屁一区二区| 精品一区二区在线免费观看| 国产精品高清亚洲| 日韩一级二级三级| 91精品1区2区| 国产激情一区二区三区桃花岛亚洲| 一区二区三区波多野结衣在线观看| 欧美一区二区三区小说| av激情综合网| 国产一区二区在线视频| 亚洲综合一区二区精品导航| 久久久久久久久免费| 欧美三级在线看| 成人激情小说网站| 麻豆免费精品视频| 亚洲一区二区视频| 国产精品视频九色porn| 日韩午夜电影av| 在线观看国产一区二区| 国产精品羞羞答答xxdd| 性做久久久久久免费观看欧美| 国产精品欧美综合在线| 日韩精品一区国产麻豆| 91成人免费电影| av中文字幕亚洲| 国产成人在线观看免费网站| 日韩成人免费电影| 亚洲精品久久7777| 国产欧美一区二区在线| 欧美成人三级在线| 91精品国产欧美一区二区18| 色婷婷综合久色| 成人福利视频网站| 国产一区二区三区日韩| 日韩高清电影一区| 亚洲一卡二卡三卡四卡| 综合电影一区二区三区| 中文av一区特黄| 日本一区二区三区在线不卡| 精品国产免费一区二区三区香蕉| 欧美日产国产精品| 一本色道亚洲精品aⅴ| 99热这里都是精品| 白白色亚洲国产精品| 粉嫩aⅴ一区二区三区四区 | 欧美人牲a欧美精品| 一本大道av伊人久久综合| 91在线无精精品入口| k8久久久一区二区三区| 丰满亚洲少妇av|