HTTP协议URL解析的C语言实现

/**

 * 日期:2017年12月21日

 * 作者:DSLMing

 * 原因:没有看到合适的解析URL代码,自己写一个。

 * 应用:WIFI模块的Webserver

 * 心情:可能不做嵌入式开发了,转向Java 的Hadoop

 * 特点:不依赖很多东西,小巧稳定

 */

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

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用 C 语言上传图片到 HTTP 服务器并生成图片的 URL 需要一些步骤: 1. 创建一个 HTTP 请求,其中包含图片文件作为请求数据。 2. 将请求发送到服务器,使用 socket 编程可以实现。 3. 如果请求成功,服务器将返回一个包含图片 URL 的响应。 这个过程需要对 HTTP 协议和 socket 编程有较深的了解,代码实现也较为复杂。如果你需要实现这个功能,建议使用其他语言,例如 Python,来编写代码。 ### 回答2: 在C语言中上传图片并生成URL,可以通过以下步骤实现: 1. 首先,需要使用C语言中的网络编程库来实现HTTP请求。常用的网络编程库有libcurl、libsocket等。你可以选择其中一个库并将其包含到你的代码中。 2. 接下来,需要使用HTTP的POST方法将图片数据发送到服务器。你可以使用C语言的文件操作相关函数打开和读取图片文件,然后使用网络编程库发送HTTP请求,将图片数据作为请求的body部分发送给服务器。 3. 服务器接收到图片数据后,会将其保存到指定位置,并返回生成的URL给你的程序。你可以使用网络编程库接收服务器的返回内容,并解析出其中的URL信息。 4. 最后,你可以将生成的URL打印输出或保存到文件中。 需要注意的是,你需要根据具体的服务器接口要求来设置HTTP请求的头部、URL和请求方法等。具体的实现细节可能会根据不同的网络编程库有所不同,你需要参考相应的文档或示例代码进行调用。 值得一提的是,如果你要上传的图片较大或者服务器要求上传以分片方式进行,那么你可能需要实现文件分片读取和上传的功能,并根据服务器返回的进度和结果进行相应的处理。这就需要更高级的网络编程和文件操作知识。 希望以上的回答能够帮助到你,祝你实现上传图片并生成URL的功能成功! ### 回答3: 在C语言中,可以使用网络编程库如libcurl实现HTTP上传图片并生成URL。 首先,需要引入libcurl库并初始化它。然后,创建一个CURL对象,设置上传URL和相关选项。 接下来,打开要上传的图片文件,读取图片内容,并将其设置为上传数据。可以使用fopen()和fread()函数来读取图片文件。 然后,设置HTTP头部,确保服务器能正确识别上传的数据类型。可以使用curl_slist_append()函数来添加头部。 接着,将所有设置完成的CURL对象传给curl_easy_perform()函数,实现上传图片操作。上传完成后,可以检查返回的HTTP状态码,确认上传是否成功。 最后,在上传成功后,可以从服务器返回的数据中解析出生成的URL。使用curl_easy_getinfo()函数获取URL相关信息,如头部字段的Location值。 解析URL时,可以使用字符串处理函数如strstr(),或者使用标准的C语言字符串操作函数如sscanf()、strtok()等。 最后,销毁CURL对象并释放资源。 总的来说,通过使用网络编程库libcurl,结合文件操作和字符串处理函数,可以在C语言实现HTTP上传图片,并生成上传后的URL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值