📄 webserver.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 + -