⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserver.cpp

📁 在UBTUNTU下
💻 CPP
字号:
#include "stdafx.h"
#include "Tools.h"
#include "WebServer.h"

CWebServer::CWebServer()
{

}

CWebServer::~CWebServer()
{

}

void CWebServer::Init(const char *pszRoot)
{
	strncpy(m_szRoot,pszRoot,MAX_PATH-1);
	m_szRoot[MAX_PATH-1]=0;
}

int CWebServer::Start(unsigned nPort)
{
	if(m_sockSvr.Create()!=0)
		return -1;
	if(m_sockSvr.Listen(nPort)!=0)
		return -2;
	while(true)
	{
		SOCKET iSockCnt=m_sockSvr.Accept();
		ProcessClient(iSockCnt);
	}
	return 0;
}

void CWebServer::ProcessClient(SOCKET iSockCnt)
{
	if(fork()!=0)//创建子进程处理请求
		return;
	CMyFile fSockCnt;
	char szReqHead[BUFSIZ],szCmd[4],szReqFile[BUFSIZ];
	char szBuf[BUFSIZ];
	//
	if(!fSockCnt.Open(iSockCnt,"r")){
		perror("Convert socket to file failed.\n");
		return;
	}
	//读请求头
	if(!fSockCnt.ReadLine(szReqHead,BUFSIZ)){
		perror("Read request head failed.\n");
		return;
	}
	//将多余的请求信息扔掉。
	while(fSockCnt.ReadLine(szBuf,BUFSIZ))
		if(strcmp(szBuf,"\r\n")==0)
			break;
	//获取命令
	if(!CopyStrByTag(szCmd,sizeof(szCmd),szBuf,""," ")){
		perror("Unknown command.\n");
		return;
	}
	//获取请求文件
	if(!CopyStrByTag(szReqFile,sizeof(szReqFile),szBuf+3," "," ")){
		perror("Bad request dir.\n");
		return;
	}
	//////////////////////解析请求并分发处理
	if(strcmp(szCmd,"GET")!=0 ||
	   szReqFile[0]!='/' ||
	   strstr(szReqFile,"..")!=NULL){
		RpsBadRequest(fSockCnt);
		return;
	}
	strcpy(szBuf,m_szRoot);
	strcat(szBuf,szReqFile);
	if(IsDir(szBuf)){				
		RpsDirList(fSockCnt,szBuf);	//目录列表
	}else if(!IsFile(szBuf)){		
		RpsNoFile(fSockCnt);		//文件不存在
	}else{
		RpsNormal(fSockCnt,szBuf);	//正常响应
	}
	return;
}

void CWebServer::RpsBadRequest(CMyFile &fSockCnt)
{
	
}

void CWebServer::RpsNoFile(CMyFile &fSockCnt)
{
	
}

void CWebServer::RpsDirList(CMyFile &fSockCnt,const char *pszBuf)
{

}

void CWebServer::RpsNormal(CMyFile &fSockCnt,const char *pszBuf)
{
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -