Web服务器继续。。
HTTP协议是怎样实现的?
1.网络协议HTTP处理过程:
2.个人认为比较重要的部分在于数据包解包以及打包头部数据部分:参考链接
数据报头部信息必须严格按照HTTP数据报格式:
sprintf((char*)Header, "HTTP/1.0 %s\r\nDate: %s\r\nServer: %s\r\nContent-Type: %s\r\nContent-Length:%d\r\nLast-Modified: %s\r\n\r\n",
"200 OK",
curTime,
"My Http Server",
ContenType,
length,
last_modified);
如何将接收的http请求报文解包出如下格式:
请求方法 URL HTTP版本号
请求头信息
请求数据
<一个空行,这是请求的结束行>
使用strtok()方法以“空格+换行”作为标号,参考链接
int CWebServerDlg::Analyze(PREQUEST pReq, char* pBuf)
{
//分析接收到的信息
char szSeps[] = " \n";
char *cpToken;
//判断request的method
cpToken = strtok(pBuf, szSeps);
if (!_stricmp(cpToken, "GET"))
{
pReq->nMethod = 0;
//ADD
CString *pStr = new CString;
*pStr = "GET";
SendMessage(LOG_MSG, (UINT)pStr, NULL);
//ADD
}
else
{
strcpy(pReq->StatuCodeReason, "501 Not Implemented");
//ADD
CString *pStr = new CString;
*pStr = "501 Not Implemented";
SendMessage(LOG_MSG, (UINT)pStr, NULL);
//ADD
return 1;
}
//获取Request-URL
cpToken = strtok(NULL, szSeps);
strcpy(pReq->szFileName, m_strRootDir);
if (strlen(cpToken) > 1)
{
strcat(pReq->szFileName, cpToken);
}
else
{
strcat(pReq->szFileName, "/index.html");
}
return 0;
}
3.辅助:如何获取系统时间以及文件的最后一次修改时间?
//格林时间星期转换
char *week[] = { "Sun,","Mon,","Tue,","Wed,","Thu,","Fri,","Sat,", };
//月份转换
char *month[] = { "Jan","Feb","Mar","Apr","May","Jun","jul","Aug","Sep","Oct","Nov","Dec" ,};
void CWebServerDlg::GetCurentTime(LPSTR lpszString)
{
//活动本地时间
SYSTEMTIME st;
GetLocalTime(&st);
//事件格式化
wsprintf(lpszString, "%s %02d %s %d %02d:%02d:%02d GMT", week[st.wDayOfWeek], st.wDay, month[st.wMonth - 1],
st.wYear, st.wMinute, st.wSecond);
}
bool CWebServerDlg::GetLastModified(HANDLE hFile, LPSTR lpszString)
{
//获得文件的last-modified时间
FILETIME ftCreat, ftAccess, ftWrite;
SYSTEMTIME stCreate;
FILETIME ftime;
//获取文件的last-modified的UTC时间
if (!GetFileTime(hFile, &ftCreat, &ftAccess, &ftWrite))
{
return false;
}
FileTimeToLocalFileTime(&ftWrite, &ftime);
//UTC手机将转化为本地时间
FileTimeToSystemTime(&ftime, &stCreate);
//时间格式化
wsprintf(lpszString, "%s %02d %s %d %02d:%02d:%02d GMT", week[stCreate.wDayOfWeek],
stCreate.wDay, month[stCreate.wMonth - 1], stCreate.wYear, stCreate.wHour,
stCreate.wMinute, stCreate.wSecond);
}
4.演示效果:
Web服务器的源码提供:
https://github.com/xxno-n/WebServer.git