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

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言实现HTTP协议传输程序需要遵循HTTP协议的规则,并使用套接字编程实现网络通信。这是一个简单的例子: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netdb.h> int main(int argc, char *argv[]) { int sockfd, bytes; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; if (argc < 2) { printf("Usage: %s hostname\n", argv[0]); exit(1); } host = gethostbyname(argv[1]); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); server_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(server_addr.sin_zero), 8); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } sprintf(buffer, "GET / HTTP/1.1\r\n\r\n"); send(sockfd, buffer, strlen(buffer), 0); while ((bytes = recv(sockfd, buffer, 1024, 0)) > 0) { buffer[bytes] = '\0'; printf("%s", buffer); } close(sockfd); return 0; } ``` 这个程序通过主机名发送一个GET请求,并打印出响应的内容。 ### 回答2: 要实现一个基本的HTTP协议传输程序,你可以按以下步骤进行: 1. 导入所需的头文件:`stdio.h`, `stdlib.h`, `string.h`, `sys/socket.h`, `netinet/in.h` 2. 创建一个套接字来连接到服务器,并检查是否成功创建。 ```c int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("套接字创建失败\n"); exit(1); } ``` 3. 设置服务器地址和端口,并使用 `connect()` 函数连接到服务器。 ```c struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); server_addr.sin_addr.s_addr = inet_addr("服务器IP地址"); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { printf("连接服务器失败\n"); exit(1); } ``` 4. 创建HTTP请求并发送到服务器。你可以使用 `send()` 函数发送请求。 ```c char request[1024] = "GET / HTTP/1.1\r\nHost: 服务器IP地址\r\nConnection: close\r\n\r\n"; if (send(sockfd, request, strlen(request), 0) == -1) { printf("发送请求失败\n"); exit(1); } ``` 5. 从服务器接收响应并打印出来。你可以使用 `recv()` 函数接收响应。 ```c char response[4096]; memset(response, 0, sizeof(response)); if (recv(sockfd, response, sizeof(response), 0) == -1) { printf("接收响应失败\n"); exit(1); } printf("%s\n", response); ``` 6. 关闭套接字连接。 ```c close(sockfd); ``` 这样,你就实现了一个简单的HTTP协议传输程序。当然,这只是一个基本的示例,你可以根据实际需求添加更多的功能,如处理响应状态码、解析响应头等。 ### 回答3: 实现一个基本的HTTP协议传输程序涉及到建立TCP连接、发送HTTP请求、接收HTTP响应等步骤。以下是一个简单的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netdb.h> #define MAX_BUFFER_SIZE 1024 int main() { int sockfd; char buffer[MAX_BUFFER_SIZE]; char request[MAX_BUFFER_SIZE]; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("Error creating socket"); exit(1); } // 设置服务器信息 struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(80); struct hostent *host; host = gethostbyname("www.example.com"); server.sin_addr = *((struct in_addr *)host->h_addr); // 建立TCP连接 if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1) { perror("Error connecting to server"); exit(1); } // 构建HTTP请求 snprintf(request, sizeof(request), "GET / HTTP/1.1\r\n" "Host: www.example.com\r\n" "Connection: close\r\n" "\r\n"); // 发送HTTP请求 if (send(sockfd, request, strlen(request), 0) == -1) { perror("Error sending request"); exit(1); } // 接收HTTP响应 ssize_t received; while ((received = recv(sockfd, buffer, sizeof(buffer) - 1, 0)) > 0) { buffer[received] = '\0'; printf("%s", buffer); } // 清理套接字 close(sockfd); return 0; } ``` 以上示例代码实现了一个简单的HTTP协议传输程序。它使用了C语言的socket库函数,通过建立TCP连接、发送HTTP请求以及接收HTTP响应来实现与服务器的通信,并将接收到的响应打印到控制台上。 请注意,该示例仅用于演示目的,实际的HTTP协议传输程序可能需要更多的错误处理、协议解析和其他功能来实现完整的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值