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

📄 handler_http.c

📁 uCOS-II下实现的lwip协议栈实现Ping功能
💻 C
📖 第 1 页 / 共 2 页
字号:
	OSTimeDlyHMSM(0, 0, 0, 100);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __ilvSendDNNotExist
//* 功能描述 : 发送IP地址
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
__inline void __ilvSendDNNotExist(ST_NETCONN *pstConn)
{
	__vHTTPRespInfo(pstConn, 
					"<boady><br><br><h1>查询的域名不存在!<a href='#'  onclick='history.back();'>返回</a></h1></body>", 
					strlenExt("<boady><br><br><h1>查询的域名不存在!<a href='#'  onclick='history.back();'>返回</a></h1></body>"));
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __ilvSendNotConn
//* 功能描述 : 发送错误信息
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
__inline void __ilvSendNotConn(ST_NETCONN *pstConn)
{
	__vHTTPRespInfo(pstConn, 
					"<boady><br><br><h1>无法收到DNS服务器的响应!<a href='#'  onclick='history.back();'>返回</a></h1></body>", 
					strlenExt("<boady><br><br><h1>无法收到DNS服务器的响应!<a href='#'  onclick='history.back();'>返回</a></h1></body>"));
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __vDNToIP
//* 功能描述 : 将域名转换为IP地址
//* 入口参数 :   <pstConn>[in] 指向ST_NETCONN结构的指针
//*          : <pstNetbuf>[in] 指向ST_NETBUF结构的指针
//*          :  <pszParam>[in] 指向参数开始位置的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __vDNToIP(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf, BYTE *pszParam)
{
	LONG	__lValLen, __lParamTotLen, __lQuestionLen;
	BYTE	__szParam[128];
	BYTE	__szQuestion[132];
	ULONG   __ulIP;
	
	//* 首先取出参数
	memset(__szParam, 0, sizeof(__szParam));
	
	__lValLen = (LONG)(pszParam - (BYTE*)pstNetbuf->ptr->payload);
	__lParamTotLen = (LONG)pstNetbuf->ptr->len - __lValLen;
	memcpy(__szParam, pszParam, __lParamTotLen);
	
	if(pstNetbuf->ptr->tot_len > pstNetbuf->ptr->len)
		netbuf_copy(pstNetbuf, __szParam + pstNetbuf->ptr->len, sizeof(__szParam) - 1 - __lParamTotLen);
		
	__lParamTotLen = pstNetbuf->ptr->tot_len - __lValLen;
	if(__lParamTotLen > sizeof(__szParam) - 1)
	{
		__vHTTPError(pstConn);	
		return;
	}
	
	//* 封装DNS查询参数
	__lQuestionLen = __illPacketDNSQuestion(__szParam, __lParamTotLen, __szQuestion, sizeof(__szQuestion));
	
	switch(ulDNToIP(__szQuestion, __lQuestionLen, &__ulIP))
	{
		case	1        :
				__ilvSendIP(pstConn, __ulIP);
				break;
		
//		case	DNS_OTHER     :
//		case	DNS_NOT_EXIST :
				__ilvSendDNNotExist(pstConn);
				break;
				
//		case	DNS_NOT_CONN  :
				__ilvSendNotConn(pstConn);
				break;
		default				  :
				__vHTTPError(pstConn);
				break;
	}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __pstGetParamNetbuf
//* 功能描述 : 获取POST参数值所在的netbuf地址
//* 入口参数 : <pstNetbuf>[in] 指向ST_NETBUF结构的指针
//*          : <ppszParam>[out] 指向参数的开始位置的指针的指针
//* 出口参数 : 返回指向包含参数值的netbuf的指针
//*------------------------------------------------------------------------------------------------
/*static ST_NETBUF *__pstGetParamNetbuf(ST_NETBUF *pstNetbuf, PP ppszParam)
{
	BYTE		__szParamSplitSymbol[5] = {0x0D, 0x0A, 0x0D, 0x0A, 0x00};
	BYTE		*__pbData;
	LONG		__lLen;
	ST_NETBUF 	*__pstNetbuf = pstNetbuf;

	do{
		netbuf_data(__pstNetbuf, &__pbData, &__lLen);
		
		if((*ppszParam = memstrExt(__pbData, __szParamSplitSymbol, 4, __lLen)) != NULL)
			return __pstNetbuf;

	}while(netbuf_next(__pstNetbuf) >= 0);
	
	return NULL;
}*/
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __pvParsePostMethod
//* 功能描述 : 解析HTTP请求的POST方法,获取函数指针
//* 入口参数 :  <pstNetbuf>[in]  指向ST_NETBUF结构的指针
//*          : <ppstNetbuf>[out] 指向POST参数所在的netbuf指针的指针
//*          :  <ppszParam>[out] 指向参数的开始位置的指针的指针
//* 出口参数 : 返回指向POST处理函数的指针
//*------------------------------------------------------------------------------------------------
/*static pfunvPHandler __pfunParsePostMethod(ST_NETBUF *pstNetbuf, ST_NETBUF **ppstNetbuf, PP ppszParam)
{
	LONG	__lLen;
	BYTE	*__pszNext, *__pszStart;
	BYTE	__szHandlerName[POST_HANDLER_NAME_LEN + 1];
	BYTE	i, __bNameLen;
	
	netbuf_data(pstNetbuf, &__pszStart, &__lLen);
	__pszStart += 6;
	__pszNext = memstrExt(__pszStart, " ", 1, POST_HANDLER_NAME_LEN);
	
	if(__pszNext != NULL && (__pszNext > __pszStart))
	{
		memset(__szHandlerName, 0, sizeof(__szHandlerName));
		__bNameLen = __pszNext - __pszStart;
		memcpy(__szHandlerName, __pszStart, __bNameLen);
		
		//* 查找处理函数
		for(i=0; i<STA_PHANDLER_NB; i++)
		{
			if((strncmp(__staPHandlers[i].szHandlerName, __szHandlerName, __bNameLen) == 0) 
				&& (__bNameLen == __staPHandlers[i].lNameLen))
			{
				*ppstNetbuf = __pstGetParamNetbuf(pstNetbuf, ppszParam);
				if(*ppstNetbuf != NULL)
					return __staPHandlers[i].pfunvPostHandler;
				else
					break;
			}
			else;
		}
	}
	
	return NULL;
}*/
//*------------------------------------------------------------------------------------------------
//* 函数名称 : Handler_HTTPPost
//* 功能描述 : 处理HTTP协议的POST请求
//* 入口参数 :   <pstConn>[in] 指向ST_NETCONN结构的指针
//*          : <pstNetbuf>[in] 指向ST_NETBUF结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __Handler_HTTPPost(ST_NETCONN *pstConn, ST_NETBUF *pstNetbuf)
{
	pfunvPHandler	__pfunvPHandler;
	ST_NETBUF 		*__pstNetbuf;
	BYTE			*__pszParam;
		
	//if(( __pfunParsePostMethod(pstNetbuf, &__pstNetbuf, &__pszParam)) != 0)
	{
		__pfunvPHandler(pstConn, __pstNetbuf, __pszParam + 4);
	}
	//else
	{
		__vHTTPError(pstConn);		
	}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : Handler_HTTP
//* 功能描述 : HTTP处理
//* 入口参数 : <pstConn>[in] 指向ST_NETCONN结构的指针
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void Handler_HTTP(ST_NETCONN *pstConn)
{
	ST_NETBUF 		*__pstNetbuf;
	BYTE			*__pbData;
	LONG			__lLen;

	__pstNetbuf = netconn_recv(pstConn);
	if(__pstNetbuf != NULL)
	{
		netbuf_data(__pstNetbuf, &__pbData, &__lLen);

		if(memstr(__pbData, "GET", 3, __lLen))
		{
			__Handler_HTTPGet(pstConn);
		}
		else if(memstr(__pbData, "POST", 3, __lLen))
		{
			__Handler_HTTPPost(pstConn, __pstNetbuf);
		}
		else;
		netbuf_delete(__pstNetbuf);	
	}
					
	netconn_close(pstConn);
}

LONG strlenExt(const BYTE *pbSrc)
{
	int 		i = 0;
	const BYTE	*__pbNext = pbSrc;
	
	while(*(__pbNext+i) != 0x00)
		i++;
		
	return i;
}


BYTE *strcatExt(BYTE *pbDest, ULONG ulDestLen, const BYTE *pbSrc, ULONG ulSrcLen)
{
	BYTE		*__pbStartAddr;
	BYTE		*__pbEndAddr;
	int			i;

	//* 首先找到被追加的开始地址,如果结束地址已经到了接收缓冲区的尾部则不再追加
	__pbStartAddr = pbDest + strlenExt(pbDest);
	__pbEndAddr = pbDest + ulDestLen;	
	i = 0;
	while((__pbStartAddr + i) < __pbEndAddr && i < ulSrcLen)
	{
		*(__pbStartAddr + i) = *(pbSrc + i);		
		i++;
	}
	
	return pbDest;
}

BOOLEAN memstr(BYTE *pbMem, BYTE *pbStr, ULONG ulStrSize, ULONG ulMemSize)
{
	BYTE *__pbNext = pbMem;
	
	__pbNext = MemChr(__pbNext, (BYTE)pbStr[0], ulMemSize);
	while(__pbNext != NULL)
	{
		if(__pbNext != NULL)
		{
			if(strncmp(__pbNext, pbStr, ulStrSize) == 0)
				return TRUE;
			
			__pbNext += 1;
			__pbNext = MemChr(__pbNext, (BYTE)pbStr[0], (pbMem + ulMemSize) - __pbNext);
		}
	}
		
	return FALSE;
}
BYTE *MemChr(BYTE *pbMem, BYTE bBYTE, ULONG ulMemSize)
{
	BYTE		*__pbNext = pbMem;
	int			i;

	for(i=0; i<ulMemSize; i++)
	{
		if(*(__pbNext+i) == bBYTE)
			return (__pbNext + i);
	}
	
	return NULL;
}

⌨️ 快捷键说明

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