C语言解析http协议

2023-05-16

C语言解析http协议

  • 1 关键解析函数
    • 1.1 strstr()
    • 1.2 strncmp()
  • 2 代码

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
请按任意键继续. . .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言解析http协议 的相关文章

  • Vagrant 的端口转发不起作用[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在最后遇到了一个小问题入门指南vagrant http vagrantup com docs getting started ports html
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • 即使禁用缓存,Safari 也会缓存 GET 请求

    我已经将我所知道的所有标头设置为在我的服务器上禁用缓存 甚至禁用 ETAG 但 Safari 仍然偶尔 大约 50 次 缓存我的请求 Workflow 我正在实施 oauth 1 所以 浏览器使GET api user request 服务
  • 检测用户是否位于代理后面

    我试图弄清楚如何检测登录我网站的人是否在代理后面 我读到您可以通过可嵌入对象 Flash 和 Java 检测一个人的真实 IP 地址 但是 我实际上无法找到任何示例或来源 我正在使用 PHP 并且我已经阅读了寻找 SERVER HTTP X
  • IE 下的 Http 请求速度变慢

    在我的 javascript 应用程序中工作时 我注意到使用 IE 11 时 相同的 ajax 请求时间最多延长 10 倍 响应大小完全相同 12 6KB 我看到的唯一区别是 IE 添加 Pragma no cache 不是铬 Chrome
  • 将对象数组作为请求中的 url 参数传递

    我需要将一个对象数组 每个对象有 2 个字段 作为 http 请求的 url 中的参数 我该怎么做以及这个链接应该是什么样子 您可以使用您的结构创建一个 xml 即一个对象数组 每个对象都有两个字段 然后将其转换为字符串 如下所示 举个例子
  • RxJS Angular2 在 Observable.forkjoin 中处理 404

    我目前正在链接一堆 http 请求 但是在订阅之前我无法处理 404 错误 My code 在模板中 service getData subscribe data gt this items data err gt console log
  • 我应该使用哪种协议来传输音频(非直播)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用创建的 201 进行重定向

    有没有办法通过 201 答案重定向 RFC规定新创建的资源必须在Location标题 我确实指定了它 我假设浏览器会重定向 但事实并非如此 即使页面没有内容 我希望用户在 POST 操作之后重定向到新资源 因此我很想使用303 See Ot
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 在电子邮件中使用协议相对 URL 安全吗?

    关于在 HTML 中使用协议相对 URL 已有讨论 1 但是电子邮件呢 电子邮件客户端或 Gmail 等服务提供商在 HTML 电子邮件中使用时是否会删除或修改协议相对 URL 1 我可以将所有 http 链接更改为 吗 https sta
  • 使用 HTML 表单时如何在 HTTP 请求正文中发送数据?

    HTTP 规范规定 POST 请求可以包含任意数据体 An HTML form元素可以 POST 到 URL 并且可能包含input元素 但那些input元素变成查询字符串 我怎样才能得到一个form还可以在按下提交按钮时发送的 HTTP
  • WCF - 进行多次调用时随机客户端超时

    我有一个WPF客户端通过以下方式请求数据WCF服务托管于IIS 7 服务方法调用存储过程 SQL 2012 using EF检索一些数据 由于需要加载大量数据 因此客户端会多次调用服务方法 以 分解 数据加载并避免大量负载和超时 我们使用生
  • 内容长度标头与分块编码

    我正在尝试权衡设置的利弊Content LengthHTTP 标头与使用分块编码从我的服务器返回 可能 大文件的比较 使用持久连接需要其中之一来符合 HTTP 1 1 规范 我看到了的优点Content Length标头是 下载对话框可以显
  • Non-Authoritative-Reason 标头字段 [HTTP]

    当我有响应标头时 我很难找出它的含义Non Authoritative Reason HSTS 我搜索了很多 但只是想出了一些关于 HSTS 从 HTTP 重定向到 HTTPS 的解释 有人能帮我吗 顺便说一句 我正在使用 Chrome T
  • PHP 是否有与 Java 的 RequestDispatcher.forward 等效的功能?

    在 Java 中我可以编写一个非常基本的 JSPindex jsp像这样 这样做的效果是用户请求index jsp 或者只是包含目录 假设index jsp是目录的默认文档 将会看到home action没有浏览器重定向 即 forward
  • 是否有用于通过 HTTP、HTTP 隧道发送二进制数据的 Java 库?

    我想通过 HTTP 以二进制格式发送相当大的数据块 也称为HTTP 隧道 http en wikipedia org wiki HTTP tunnel 我想通过 Java 将这种技术用于一些 Java Swing 应用程序 也可能是 And
  • 通过 HTTPS 加载页面但请求不安全的 XMLHttpRequest 端点

    我有一个页面 上面有一些 D3 javascript 该页面位于 HTTPS 网站内 但证书是自签名的 当我加载页面时 我的 D3 可视化效果不显示 并且出现错误 混合内容 页面位于 https integration jsite com
  • 如何使用 http 将 Android 中的文件从移动设备发送到服务器?

    在android中 如何使用http将文件 数据 从移动设备发送到服务器 很简单 您可以使用 Post 请求并将文件作为二进制 字节数组 提交 String url http yourserver File file new File En
  • 我应该使用多个 HttpClient 来进行批量异步 GET 请求吗?

    我有一个场景 我需要在尽可能短的时间内发出大量 GET 请求 想想大约 1000 个 我知道通常最好保留一个客户端并尽可能重用它 Create Single HTTP Client HttpClient client new HttpCli

随机推荐

  • Javaweb QQ第三方登录

    这是第三方登录的第二篇 xff0c 关于web接入微博第三方登录可以参考我之前的博文 xff0c 之前的博文比较详细的讲解了该如何进行第三方登录的申请和准备工作 http blog csdn net cwfjimogudan article
  • vmware 虚拟机启动失败, Intel VT-x 处于禁用状态

    错误提示 xff1a 已将该虚拟机配置为使用 64 位客户机操作系统 但是 xff0c 无法执行 64 位操作 此主机支持 Intel VT x xff0c 但 Intel VT x 处于禁用状态 如果已在 BIOS 固件设置中禁用 Int
  • java 35 个 Java 代码性能优化总结

    前言 代码优化 xff0c 一个很重要的课题 可能有些人觉得没用 xff0c 一些细小的地方有什么好修改的 xff0c 改与不改对于代码的运行效率有什么影响呢 xff1f 这个问题我是这么考虑的 xff0c 就像大海里面的鲸鱼一样 xff0
  • 基于51单片机超声波红外避障语音导盲仪设计(全套资料)

    基于51单片机的超声波红外避障语音导盲仪设计 本系统采用STC89C52单片机 43 4位高亮白色LED灯 43 红外避障传感器电路 43 超声波电路 43 光敏电阻模块 43 语音报警电路 43 震动电路 43 液晶1602电路 43 电
  • linux 解压zip压缩包命令

    unzip 文件名 zip d 解压位置 例如 xff1a unzip 微信 zip d demowx
  • linux 文件授权命令

    文件授权 chmod 43 x sh
  • linux tomcat常用命令

    startup sh 启动tomcat shutdown sh 关闭tomcat ps ef grep tomcat 查看Tomcat运行 kill 9 4723 杀进程 tail f catalina out 查看tomcat运行日志 c
  • linux redis常用命令

    flushall 清空redis缓存 redis cli 进入redis xff08 需要进入redis的安装目录下 xff09 get key 查找key del key 删除key
  • java DateUtils时间工具栏

    package com eeye common utils import org apache commons lang3 time DateFormatUtils import java text ParseException impor
  • unity3d:Astar寻路,A星,A*,二叉堆优化Open表

    原理视频 油管 xff1a https youtu be i0x5fj4PqP4 别人的B站翻译 xff1a https www bilibili com video BV1v44y1h7Dt spm id from 61 333 999
  • TCP/IP 、HTTP、Socket的区别与联系

    1 Socket和http的区别 http xff1a 如何封装数据 xff1b 基于TCP协议 xff0c 简单的对象访问协议 xff0c 对应于应用层 xff1b xff08 货物 xff09 tcp协议 xff1a 数据在网络中的传输
  • 【亲测一次成功】将本地代码上传到Gitee码云

    1 在Gitee码云上创建仓库 2 在本地新建一个文件夹 3 右击新建的文件夹 xff0c 使用git bush here 4 输入 git init 5 输入 git remote add origin 43 仓库地址 6 输入 git
  • keil5打开工程报错:error:not found device

    1 error not found device 解决方法 xff1a 将Project文件夹中的工程扩展名由 uvproj改为 uvprojx 原因 xff1a 前提是所有的库安装都是正常且正确的 xff0c 所以应该是如下问题 xff1
  • STM32学习笔记:IWDG_独立看门狗

    1 简介 独立看门狗就是一个12位的递减计数器 xff0c 最大值0xFFF xff1b 计数器的值从某一个值减到0时 xff0c 系统产生一个复位信号 xff08 IWDG RESET xff09 xff1b 在计数器没减到0之前 xff
  • 基于单片机避障导盲智能拐杖控制设计(毕设资料)

    本设计研究为盲人提供行走时 xff0c 遇到前方障碍物提前躲避的智能避障预警系统 以AT89S52单片机作为核心处理器 xff0c 采用超声波回波时间差测量人与物体之间的安全距离 xff0c 实现了提前预警使用者避让障碍物 xff0c 起到
  • Matlab:excel文件 转 txt文件 (只需2行代码)

    亲测有用 xff0c 只需两行代码 xff0c 将EXCEL文件 xff0c 转换成txt文件 xff1a Data 61 readtable 39 TEST xls 39 writetable Data 39 test txt 39 ex
  • 快速理解C语言——指针

    1 地址和内存 把值存在内存中 xff0c 内存就给每一个值分配一个地址 xff1a 100 104 108 112 116就是每个值分别对应的地址 xff1b 给每个内存地址起个别名 xff0c 就是 xff1a 变量 2 值和类型 如下
  • 亲测有用!完美关闭win10不断自动更新

    自从更新到win10以来 xff0c 每次开关机都会遇到win10更新的问题 试过CSDN和其他很多种方法都没有用 xff0c 最后在知乎上看到一个大神写的 用以下方法完美解决 xff0c 再没出现过自动更新的问题 如何完美解决win10自
  • 一文解决所有PCA问题——这是我看过最好的讲解PCA理论文章

    转载 xff1a http blog codinglabs org articles pca tutorial html PCA xff08 Principal Component Analysis xff09 是一种常用的数据分析方法 P
  • C语言解析http协议

    C语言解析http协议 1 关键解析函数1 1 strstr xff08 xff09 1 2 strncmp 2 代码 1 关键解析函数 1 1 strstr xff08 xff09 函数原型 xff1a span class token