IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言解析http协议 -> 正文阅读

[C++知识库]C语言解析http协议

1 关键解析函数

1.1 strstr()

函数原型

extern char *strstr(char *str1, const char *str2);

str1: 被查找目标 
str2: 要查找对象 
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

例子:

char str[]="1234xyz";
char *str1=strstr(str,"34");
// cout << str1 << endl;  #cpp版本
printf("%s",str1);

显示的是: 34xyz

1.2 strncmp()

strncmp函数为字符串比较函数,字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。

函数原型:

int strncmp(const char *str1, const char *str2, size_t n)

参数:

  • str1 – 要进行比较的第一个字符串。
  • str2 – 要进行比较的第二个字符串。
  • n – 要比较的最大字符数。

返回值:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str2 小于 str1。
  • 如果返回值 = 0,则表示 str1 等于 str2。

实例:

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;


   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");

   ret = strncmp(str1, str2, 4);

   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str2 小于 str1");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

2 代码

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define METHOD_DECODE(mode) mode?"POST":"GET"
 
static char data[] =
"GET /joyent/http-parser.txt HTTP/1.1\r\n"
"Host: github.com\r\n"
"DNT: 1\r\n"
"Accept-Encoding: gzip, deflate, sdch\r\n"
"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n"
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/39.0.2171.65 Safari/537.36\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/webp,*/*;q=0.8\r\n"
"Connection: keep-alive\r\n"
"Transfer-Encoding: chunked\r\n"
"Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n\r\n";
 
struct http_parser_urt
{
	char filename[32];
	char method; /* 0:GET;1:POST */
};
 
char parse_url(struct http_parser_urt * httpurl, char * strurl)
{
	char ret = 0;
	char * line_start = NULL;
	char * line_end = NULL;
	char * start_temp = NULL;
	char * end_temp = NULL;
	char * line_temp = NULL;
 
 
	/* input check */
	if( (httpurl == NULL)||(strurl == NULL) )
	{
		ret = 1;
		return ret;
	}
 
	/* check http end flag */
	line_temp = (char *)strstr(strurl, "\r\n\r\n");
	if (line_temp == NULL)
	{
		ret = 1;
		return ret;
	}
	
	/* ----------------------------------- first line ------------------------------*/
	/* Determine the first and end addresses of a line */
	line_start = strurl;
	line_end = (char *)strstr(line_start, "\r\n");
	if (line_end == NULL)
	{
		ret = 1;
		return ret;
	}
 
	/* find method name */
	if (strncmp(line_start, "GET ", 4) == 0)
	{
		httpurl->method = 0;
		start_temp = line_start + 4;
	}
	else if (strncmp(strurl, "POST ", 5) == 0)
	{
		httpurl->method = 1;
		start_temp = line_start + 5;
	}
	else
	{
		/* now do not suport method */
	}
	
	/* find file name */
	start_temp++;
	end_temp = (char *)strstr(line_start, " HTTP");
	strncpy_s(httpurl->filename, start_temp, end_temp-start_temp);
 
	return ret;
}
 
 
 
 
int main(int argc, char * argv[])
{
	char ret1 = 0;
	struct http_parser_urt url_test1;
	ret1 = parse_url(&url_test1, data);
	if (ret1 != 0)
	{
		printf("解析失败...\r\n");
		return 0;
	}
	printf("解析成功..\r\n");
	printf("方法名为:%s\r\n", METHOD_DECODE(url_test1.method));
	printf("文件名为:%s\r\n", url_test1.filename);
	system("pause");
}

运行结果:

解析成功…
方法名为:GET
文件名为:joyent/http-parser.txt
请按任意键继续. . .

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:07:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 17:39:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码