C语言 NOTE26

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

发布了52 篇原创文章 · 获赞 2 · 访问量 2000

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/103734518