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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sockcommon.cpp

?? PDA版的小型WEB服務器
?? CPP
字號:
#include "stdafx.h"
#include "SockCommon.h"
#include "trace.h"
#include <WinSock2.h>
#include <string.h>
#include <assert.h>

#define SUCCESS TRUE
#define FAILURE	FALSE

char cDefaultPage[]= "index.html";char cHostBasePath[]="webRoot";


char* strDup(char const* str) {	if (str == NULL) return NULL;	size_t len = strlen(str) + 1;  	char* copy = new char[len];	if (copy != NULL) {		memcpy(copy, str, len);	}	return copy;}
// listening thread;
UINT ServerListenThread(LPVOID lpv){

	log("listen");
	//
	SOCKET listenSock = *((SOCKET*)lpv);

	struct sockaddr_in client;

	// Optional pointer to an integer that contains the length of addr.
	int size;

	// Create a SOCKET for accepting incoming requests.
	SOCKET acceptSock;

	//log
	log("begin to listen");

	do
	{
		size = sizeof client;
		acceptSock = accept( listenSock, (struct sockaddr*)&client, &size );

		if ( acceptSock != INVALID_SOCKET )
		{
			AfxBeginThread( HttpCommunicate,(LPVOID)&acceptSock,THREAD_PRIORITY_NORMAL);
		}
	}while(1);
}


// receive request;
boolean Receive(SOCKET acceptScok,char *pRecvBuffer, int nRecvSize, int nSecs){
	ASSERT(acceptScok != NULL);
	int nReceivedSize = 0;
	if ( (nReceivedSize = recv(acceptScok,pRecvBuffer,nRecvSize,0)) == SOCKET_ERROR )
	{
		AfxMessageBox(_T("socket receive!"));
		log("socket receive!");
		return FAILURE;
	}
	return SUCCESS;
}

// parse the http request line;
HttpHeader parseRequestLine(char* pRequestLine){
	//
	char* pRequest = new char[strlen(pRequestLine)+1];
	strcpy( pRequest,pRequestLine );
	strcat( pRequest,"\0" );
	
	// change the upper case charactors to lower case;
	#define strlwr _strlwr
	strlwr( pRequest );

	HttpHeader head;
	char* pHead = pRequest;
	char* pEnd;
	int nCount = 0;
	
	// skip over the white space;
	while( *pHead == ' ' ) pHead++;
	pEnd = strchr( pHead,' ' );
	nCount =  pEnd -pHead;
	if ( nCount >0 )
	{
		strncpy( head.RequestMethod,pHead,nCount );
		head.RequestMethod[nCount] = '\0';
	}
	if ( strcmp( head.RequestMethod,"post" ) != 0 && strcmp( head.RequestMethod,"get" ) != 0 )
	{
		delete[] pRequest;
		head.IsValid = TRUE;
		return head;
	}else{
		head.IsValid = TRUE;
	}

	// get file path;
	pHead = pEnd;
	while( *pHead == ' ' ) pHead++;
	pEnd = strchr( pHead,' ' );
	nCount =pEnd - pHead ;
	if ( nCount > 0 )
	{
		strncpy( head.FilePath,pHead,nCount );
		head.FilePath[nCount] = '\0';
	}

	// http version;
	pHead = pEnd;
	while( *pHead == ' ' ) pHead++;
	pEnd = strchr( pHead,'\n' );
	nCount = pEnd - pHead;
	if (nCount > 0 )
	{
		strncpy( head.HttpVersion,pHead,nCount );
		head.HttpVersion[nCount] = '\0';
	}

	// get reference;
	if ( pHead = strstr( pRequest,"referer:") )
	{
		pHead += 8;
		while( *pHead == ' ' ) pHead++;
		pEnd = strchr( pHead,'\n' );
		nCount = pEnd - pHead;
		if (nCount > 0 )
		{
			strncpy( head.Referer,pHead,nCount-1 );
			head.Referer[nCount - 1] = '\0';
		}
	}else{
		memset( head.Referer,0,sizeof(head.Referer));
	}

	// get host;
	pHead = pRequest;
	pHead = strstr( pHead,"host:" );
	pEnd = strchr( pHead,'\n' );
	pHead += 5;
	while( *pHead == ' ' ) pHead++;
	nCount = pEnd - pHead;
	if (nCount > 0 )
	{
		strncpy( head.Host,pHead,nCount-1 );
		head.Host[nCount-1] = '\0';
	}

	// parse the file name;
	pHead = head.FilePath;
	pHead = strchr( pHead,'?' );
	if ( pHead )
	{
		strcpy( head.QueryString,pHead+1 );
		*(pHead + 1) = '\0';
	}

	// parse the relative path;
	pHead = head.FilePath;
	if ( strchr(pHead,'.'))
	{
		if ( pHead = strrchr( pHead,'/' ) )
		{
			strcpy( head.FileName,pHead+1 );
			*(pHead + 1) = '\0';
		}
	}else
		head.FileName[0] = '\0';
	

	// when the method is post , parse out the parameter;
	if(strcmp(head.RequestMethod,"post")==0)
	{
		pHead=pRequest;
		pHead=strstr(pHead,"content-length:");
		pEnd=strchr(pHead,'\n');
		pHead+=15;
		while(*pHead==' ')pHead++;
		nCount=pEnd-pHead;
		if(nCount)
		{
			char temp[10];
			strncpy(temp,pHead,nCount);
			temp[nCount]='\0';
			head.ContentLength=atoi(temp);
		}
		pHead=pRequest;
		if(pHead=strrchr(pHead,'\n'))
		{	
			strncpy(head.Parameter,pHead+1,head.ContentLength);//直接復制到尾即可
			head.Parameter[head.ContentLength]='\0';
		}
	}
	else//Get時了最好賦一下初值。
	{
		head.ContentLength=0;
		head.Parameter[0]='\0';
	}
	delete[] pRequest;
	return head;
	

}

//
//char* GetLocationHead(int nStatusCode,const char* pStatusDesStr,const char *pLocationUrl,char* pRtnVal)
//{
//	char cHeadFmt[]=
//		"HTTP/1.1 %d %s\r\n"
//		"Server: AnyServerMoblieHttpServer/1.0.0\r\n"
//		"Date: %s\r\n"
//		"Location:%s\r\n"
//		"Content-Type: text/html\r\n"
//		"Accept-Ranges: bytes\r\n";
//	char cHead[500];
//	CString strGmtNow=CTime::GetCurrentTime().FormatGmt(TEXT("%a, %d %b %Y %H:%M:%S GMT"));
//	sprintf(cHead,cHeadFmt,nStatusCode,pStatusDesStr,(LPSTR)(LPCTSTR)strGmtNow,pLocationUrl);
//	strcat(cHead,"\r\n");
//	strcpy(pRtnVal,cHead);
//	return pRtnVal;
//}


// 
//void SendLocationHead(SOCKET msSocket,const int nStatusCode,const char *pStatusDesStr,const char *pLocationUrl)
//{
//	char *pHead=new char[500];
//	GetLocationHead(nStatusCode,pStatusDesStr,pLocationUrl,pHead);
//	ConfirmSend(msSocket,pHead,strlen(pHead),10);
//	delete[] pHead;
//}


char* GetResponseHead(int nStatusCode,const char* pStatusDesStr,const char* szTypeName,
					  const char* pFileModifyTime,int nResponseContextSize,char* pRtnVal)
{
	char cHeadFmt[]=
		"HTTP/1.1 %d %s\r\n"
		"Server: Braveboy HttpServer\r\n"
		"Date: %s\r\n"
		"Content-Type: %s\r\n"
		"Accept-Ranges: bytes\r\n"
		"Content-Length: %d\r\n";
	char cHead[500];
	CString strGmtNow=CTime::GetCurrentTime().FormatGmt(TEXT("%a, %d %b %Y %H:%M:%S GMT"));
	sprintf(cHead,cHeadFmt,nStatusCode,pStatusDesStr,GetGmtTime(),szTypeName,nResponseContextSize);
	if(!pFileModifyTime)
	{
		char hdrModified[50];
		sprintf(hdrModified, "Last-Modified: %s\r\n\r\n",pFileModifyTime);
		strcat(cHead,hdrModified);
	}
	strcat(cHead,"\r\n");
	strcpy(pRtnVal,cHead);
	return pRtnVal;
}



//
void SendHead(SOCKET msSocket,const int nStatusCode,const char* szTypeName,
			  const char *pStatusDesStr, const char* pFileModifyTime,int nHtmlSize,const char *pErrorDetailMsg)
{
	char *pHead=new char[500];
	if(pErrorDetailMsg!=NULL)
	{
		char cErrorHtml[]="<Html>\n"
			"<Head><Title>HTTP %d (%s)</Title>\n"
			"</Head>\n"
			"<Body>\n"
			"<h1>%s</h1>\n"
			"<h2>錯誤詳細描述:%s</h2>\n"
			"</Body>\n"
			"</Html>";
		char cErrorBody[500];
		sprintf(cErrorBody,cErrorHtml,nStatusCode,pStatusDesStr,pStatusDesStr,pErrorDetailMsg);
		GetResponseHead(nStatusCode,pStatusDesStr,szTypeName,pFileModifyTime,strlen(cErrorBody),pHead);
		ConfirmSend(msSocket,pHead,strlen(pHead),10);	
		ConfirmSend(msSocket,cErrorBody,strlen(cErrorBody),10);
	}
	else
	{

		GetResponseHead(nStatusCode,pStatusDesStr,szTypeName,pFileModifyTime,nHtmlSize,pHead);
		ConfirmSend(msSocket,pHead,strlen(pHead),10);
	}
	delete[] pHead;
}

int ConfirmSend(SOCKET s_socket,const char *pBuffer, int nSendSize, int nSecs)
{
	int nSendBytes=0;
	int nSendedBytes=0;
	const char*p=pBuffer; 
	do
	{
		nSendBytes=Send(s_socket,p,nSendSize-nSendedBytes,nSecs);
		nSendedBytes+=nSendBytes;
		p+=nSendBytes;
	}
	while(nSendedBytes<nSendSize);
	return nSendedBytes;
}

int Send(SOCKET s_socket,const char *pBuffer, int nSendSize, int nSecs)
{
	ASSERT(s_socket!=NULL);
	FD_SET fd = {1, s_socket};
	TIMEVAL tv = {nSecs, 0};
	if(select(0, NULL, &fd, NULL, &tv) == 0){
		AfxMessageBox(_T("socket send timeout"));
		log("socket send timeout!");
		return 0;
	}
	int nSendBytes=0;
	nSendBytes=send(s_socket,pBuffer,nSendSize,NULL);
	return nSendBytes;
}

//獲得文件擴展名
char* GetFileExtName(char *pFileName)
{
	//const char *pFileName="abc.asp";
	char *pExt;
	pExt=strrchr(pFileName,'.');
	if(pExt)
		return ++pExt;
	else
		return NULL;
}

void initialHeader(HttpHeader *head){
	head->ContentLength = 0;
	head->IsValid = NULL;
	memset( head->FileName,0,sizeof(head->FileName));
	memset( head->FilePath,0,sizeof(head->FilePath));
	memset( head->Referer,0,sizeof(head->Referer));
	memset( head->Host,0,sizeof(head->Host));
	memset( head->HttpVersion,0,sizeof(head->HttpVersion));
	memset( head->QueryString,0,sizeof(head->QueryString));
	memset( head->Language,0,sizeof(head->Language));
	memset( head->Parameter,0,sizeof(head->Parameter));
}

// begin to communicate with client;
UINT HttpCommunicate(LPVOID lpv){
	//
	//
	SOCKET acceptScok = *(SOCKET*)lpv;
	char* pRequestLine = new char[1000];
	// get the request frow client browser;
	if( Receive(acceptScok,pRequestLine,1000,1000) == FAILURE )
	{
		AfxMessageBox(_T("socket receive failed!"));
		log("socket receive failed!");
		return 0;
	}

	log("receive success");

	// parse the request line;
	HttpHeader head = parseRequestLine(pRequestLine);

	// the wrong format of request line;
	if( !head.IsValid )
		return 0;

	//delete[] pRequestLine;
	//檢查頁面及路徑是否存在
	//如果請求里面沒有帶具體的頁面信息
	if(!(*head.FileName))
	{
		////檢查默認頁面如果被設置,且默認頁面都存在,則發送默認頁面,否則發送403錯誤!
		char fName[]= "index.html";
		strcpy( head.FileName,fName );

		log(head.FileName);
	}

	char csFilePath[100] = "webRoot\\";
	strcat(csFilePath, "\\");
	strcat( csFilePath ,head.FileName );
	CFile* pFile=Openfile( csFilePath );


	log( (LPSTR)(LPCTSTR)csFilePath );
	log("open request file success");

	char szTypeName[50];

	if(pFile!=NULL)
	{
		//對后綴判斷選擇不同的方法進行處理
		char *pFileExtName=GetFileExtName(head.FileName);
		if (strcmp( pFileExtName,"html")==0 || strcmp( pFileExtName,"htm")==0 )
		{
			strcpy( szTypeName,"text/html");
		}else if (strcmp( pFileExtName,"mp3")==0)
		{
			strcpy( szTypeName,"audio/mp3");
		}
		else{
			//DeleteDstFile(head.FileName,pFileExtName);
			//strcpy( szTypeName,"video/x-ms-asf");//application/octet-stream//application/x-mms-framed//video/x-ms-wmv
			strcpy( szTypeName,"video/x-ms-asf");
		}

		int nFileSize=(int)pFile->GetLength();

		CString strGmtMod=CTime::GetCurrentTime().FormatGmt(TEXT("%a, %d %b %Y %H:%M:%S GMT"));
		SendHead(acceptScok,200,szTypeName,"OK",(LPSTR)(LPCTSTR)strGmtMod.GetBuffer(0),nFileSize,NULL);
		SendFile(acceptScok,pFile);
		log("send file success");
		pFile->Close();
		//}
	}
	else
	{
		//內部程序處理錯誤
		//pFile->Close();
		SendHead(acceptScok,505,"text/html","錯誤",NULL,NULL,"文件不存在!");
	}
	delete pFile;
	Close(acceptScok);

	return 0;
}

CFile* Openfile(char *pFileName)
{
	CFile* pFile= new CFile();
	CFileException e;
	if(pFile->Open(CString(pFileName),CFile::modeRead,&e))
		return pFile;
	if(e.m_cause==CFileException::accessDenied||e.m_cause==CFileException::badPath)
	{
		delete pFile;
	}
	return NULL;
}

void Close(SOCKET s_socket)
{
	if(s_socket==NULL||s_socket==INVALID_SOCKET)return ;
	ASSERT(s_socket!=NULL);
	if(closesocket(s_socket)==SOCKET_ERROR)
	{
		AfxMessageBox(_T("Socket Close!"));
		log("Socket Close!");
		return;
	}
}

void SendFile(SOCKET msSocket,CFile* pFile)
{
	int nFileSize=(int)pFile->GetLength();
	//以最大50K的方式發送文件內容
	char* pFileContext=new char[50*MaxBufferSize];
	int nSizeToBeRead=nFileSize;//還要讀的文件大小
	int nReadSize=0;//當前要讀的內容大小
	while(nSizeToBeRead>0)
	{	
		nReadSize=min(MaxBufferSize*50,nSizeToBeRead);
		memset(pFileContext,0,MaxBufferSize*50);
		pFile->Read(pFileContext,nReadSize);
		nSizeToBeRead-=nReadSize;
		ConfirmSend(msSocket,pFileContext,nReadSize,10);
	}
	delete[] pFileContext;
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女脱光内衣内裤视频久久影院| 91亚洲午夜精品久久久久久| 天天亚洲美女在线视频| 国产精品传媒入口麻豆| 亚洲国产成人在线| 精品国产亚洲一区二区三区在线观看| 欧美三级中文字| 5858s免费视频成人| 欧美精品粉嫩高潮一区二区| 日韩午夜在线观看视频| 欧美成人a∨高清免费观看| 欧美xxxxx牲另类人与| 久久五月婷婷丁香社区| 久久久www成人免费无遮挡大片| 国产午夜精品久久久久久免费视| 2022国产精品视频| 亚洲国产精品av| 亚洲精品美腿丝袜| 天堂蜜桃91精品| 国产综合久久久久影院| 成人小视频免费观看| 色哟哟一区二区在线观看| 欧美午夜精品久久久久久超碰| 777久久久精品| 2欧美一区二区三区在线观看视频| 久久精品视频在线免费观看 | 国产精品情趣视频| 亚洲老司机在线| 日韩成人精品在线| 国产麻豆91精品| 色综合久久88色综合天天免费| 欧美在线高清视频| 欧美电影精品一区二区| 国产精品女同一区二区三区| 亚洲老妇xxxxxx| 九九**精品视频免费播放| 成人福利视频在线看| 欧美色倩网站大全免费| 精品国产91久久久久久久妲己| 中文在线一区二区| 亚洲一区二区三区三| 激情综合网av| 色综合 综合色| 欧美电影免费观看高清完整版在线观看| 国产欧美综合在线观看第十页| 亚洲美女在线一区| 麻豆精品国产91久久久久久| 99麻豆久久久国产精品免费| 9191国产精品| 国产精品免费aⅴ片在线观看| 亚洲国产日韩av| 盗摄精品av一区二区三区| 欧美三级一区二区| 中文在线资源观看网站视频免费不卡| 亚洲成人动漫在线免费观看| 成人综合激情网| 欧美一级欧美三级| 日韩精品每日更新| 国产sm精品调教视频网站| 欧美日韩国产一级二级| 国产精品乱码一区二三区小蝌蚪| 亚洲第一久久影院| 99r国产精品| 久久先锋影音av| 午夜国产精品一区| 91丨国产丨九色丨pron| 久久久久久久综合日本| 五月婷婷色综合| 99在线视频精品| xf在线a精品一区二区视频网站| 亚洲成人自拍一区| 不卡的av在线播放| 久久影院午夜论| 青青草精品视频| 欧美日韩在线免费视频| 亚洲人成网站色在线观看| 国产在线视频一区二区三区| 在线不卡一区二区| 亚洲一区二区三区四区五区中文 | 国产精品一区二区在线看| 精品视频一区三区九区| 亚洲视频一区在线观看| 国产精品1区2区3区| 精品久久一区二区| 视频一区二区中文字幕| 欧美日韩国产一区| 亚洲午夜影视影院在线观看| 色婷婷av一区| 亚洲日本护士毛茸茸| 久久亚洲二区三区| 一区二区中文字幕在线| 国产成人欧美日韩在线电影| 精品嫩草影院久久| 日韩av一区二| 91精选在线观看| 亚洲午夜激情av| 欧美在线观看一区二区| 亚洲一区二区视频在线观看| 色婷婷国产精品综合在线观看| 日韩理论片在线| 日本电影欧美片| 亚洲中国最大av网站| 91福利国产精品| 亚洲一二三四在线| 欧美日韩成人在线一区| 亚洲成年人网站在线观看| 欧美丝袜自拍制服另类| 亚洲二区在线观看| 欧美美女黄视频| 日韩高清国产一区在线| 欧美精品久久一区二区三区| 手机精品视频在线观看| 正在播放亚洲一区| 久久不见久久见免费视频1| 精品成人在线观看| 国产91精品一区二区麻豆亚洲| 国产三级一区二区| 欧美成人官网二区| 国产成人精品免费| 国产精品三级电影| 欧美影院午夜播放| 男人的j进女人的j一区| 26uuu另类欧美亚洲曰本| 大白屁股一区二区视频| 亚洲猫色日本管| 欧美久久高跟鞋激| 国产麻豆精品95视频| 国产精品美女久久久久久| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲国产精品视频| 精品久久久久一区| 99热在这里有精品免费| 天堂午夜影视日韩欧美一区二区| 欧美zozo另类异族| 99v久久综合狠狠综合久久| 午夜精品久久久久久久99樱桃| 欧美草草影院在线视频| caoporn国产一区二区| 亚洲www啪成人一区二区麻豆| 日韩一区二区三区精品视频| 国产成人av在线影院| 一区二区三区在线影院| 欧美精品第1页| 成人精品视频.| 日日嗨av一区二区三区四区| 久久久久免费观看| 在线观看日韩国产| 国产在线不卡视频| 亚洲一区二区精品3399| 久久久久久日产精品| 欧美手机在线视频| 国产成人在线视频网站| 亚洲一区二区美女| 国产欧美日韩卡一| 欧美一三区三区四区免费在线看| 国产精品小仙女| 亚洲chinese男男1069| 久久午夜色播影院免费高清| 在线观看欧美精品| 国产成人小视频| 日韩av电影免费观看高清完整版| 久久久久国产精品麻豆| 欧美日韩国产高清一区二区| 成人一级黄色片| 久久国产生活片100| 一级做a爱片久久| 久久久精品天堂| 91精品久久久久久久99蜜桃| www..com久久爱| 黑人巨大精品欧美黑白配亚洲| 亚洲国产视频一区| 日韩一区欧美一区| 2020国产精品| 6080亚洲精品一区二区| 色诱亚洲精品久久久久久| 国产成人激情av| 麻豆精品国产传媒mv男同| 亚洲一区二区精品视频| 国产精品成人一区二区艾草| 26uuu亚洲婷婷狠狠天堂| 欧美喷水一区二区| 一本久久精品一区二区| 丰满放荡岳乱妇91ww| 激情综合色丁香一区二区| 亚洲第一福利一区| 亚洲黄色av一区| 椎名由奈av一区二区三区| 亚洲国产高清在线观看视频| 精品福利在线导航| 欧美一激情一区二区三区| 在线观看欧美黄色| 久久综合色8888| 欧美一级日韩不卡播放免费| 欧美色手机在线观看| 91蜜桃在线观看| 色诱视频网站一区| 日本高清视频一区二区| 91麻豆国产在线观看| 91一区二区在线观看| 99re热视频精品|