Web服务器 HTTP协议是怎样实现的?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值