红联Linux门户
Linux帮助

Linux下发送HTTP协议请求

发布时间:2016-12-31 10:30:14来源:linux网站作者:韩搏
在Linux系统中用C语言实现的HTTP协议的POST和GET请求,下面是代码实现,如果要测试需要搭建个后台服务器的环境,作者测试用的是PHP开发环境,具体搭建可参看:
Linux下发送HTTP协议请求
 
demo.c
#include <stdio.h>  
#include <unistd.h>  
#include <string.h>  
#include <stdlib.h>  
#include <netdb.h>  
#include <arpa/inet.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
int main(int argc, char *argv[])  
{  
unsigned short port = 80;   // 服务器的端口号  
char *server_ip = "192.168.2.203";  // 服务器ip地址
int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建TCP套接字  
if(sockfd < 0)  
{  
perror("socket");  
exit(-1);  
}
struct sockaddr_in server_addr; //定义服务器信息结构体  
bzero(&server_addr,sizeof(server_addr));   
server_addr.sin_family = AF_INET;  
server_addr.sin_port = htons(port);  
inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));   // 主动连接服务器  
if(err_log != 0)  
{  
perror("connect");  
close(sockfd);  
exit(-1);  
}
char str1[1024] = "";  
char data[]="username=hanbo&num=123"; //POST 数据  
#if 1//POST 格式请求  
sprintf(str1, "%s\r\n","POST http://192.168.2.203/index.php HTTP/1.1"); //http://192.168.2.203/index.php 服务端接收数据处理文件地址  
sprintf(str1, "%s%s\r\n",str1,"Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*");  
sprintf(str1, "%s%s\r\n",str1,"Referer: */*");  
sprintf(str1, "%s%s\r\n",str1,"Accept-Language: en-US,zh-CN;q=0.5");  
sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)");  
sprintf(str1, "%s%s\r\n",str1,"Content-Type: application/x-www-form-urlencoded");  
sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate");  
sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.2.203"); //服务器地址  
sprintf(str1, "%s%s%d\r\n",str1,"Content-Length: ",strlen(data)); //数据长度  
sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive");  
sprintf(str1,"%s%s\r\n",str1,"Cache-Control: no-cache");  
sprintf(str1, "%s\r\n",str1); //多加个回车  
sprintf(str1, "%s%s\r\n",str1,data);  
#else //GET 格式请求  
sprintf(str1, "%s\r\n","GET http://192.168.2.203/index.php?username=hanbo&num=123 HTTP/1.1"); //服务端接收数据处理文件地址,并带参数  
sprintf(str1, "%s%s\r\n",str1,"Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*");  
sprintf(str1, "%s%s\r\n",str1,"Accept-Language: en-US,zh-CN;q=0.5");  
sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)");  
sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate");  
sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.2.203"); //服务器地址  
sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive");  
sprintf(str1,"%s%s\r\n",str1,"Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F");  
sprintf(str1, "%s\r\n",str1); 
#endif  
printf("----------------------------- HTTP Data ----------------------------------\n");  
printf("%s",str1);  
printf("--------------------------- Data Len=%d ----------------------------------\n\n",strlen(str1));
int ret=send(sockfd, str1, strlen(str1), 0);   // 向服务器发送信息  
if(ret<0)  
{  
perror("send");  
close(sockfd);  
exit(-1);  
}
char recv_buf[521]="";  
recv(sockfd, recv_buf, sizeof(recv_buf), 0);  
printf("------------------------ server retrun data -------------------------------\n");  
printf("%s\n\n",recv_buf);  
close(sockfd);
return 0;  
}
 
在搭建好的服务端,在Apache安装目录D:\AppServ\Apache24\htdocs 中新建文件index.php内容如下:
<?php  
/* 接收POST 格式数据处理 */  
echo "username=".$_POST['username'];  
echo "\nnum=".$_POST['num'];
/* 接收GET 格式数据处理 */  
// echo "username=".$_GET['username'];  
// echo "\nnum=".$_GET['num'];  
?>
 
运行POST请求会出现如下结果:
----------------------------- HTTP Data ----------------------------------  
POST http://192.168.2.203/index.php HTTP/1.1  
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */* 
Referer: */*  
Accept-Language: en-US,zh-CN;q=0.5  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)  
Content-Type: application/x-www-form-urlencoded  
Accept-Encoding: gzip, deflate  
Host: 192.168.2.203  
Content-Length: 22  
Connection: Keep-Alive  
Cache-Control: no-cache
username=hanbo&num=123  
--------------------------- Data Len=701 ----------------------------------
------------------------ server retrun data -------------------------------
HTTP/1.1 200 OK  
Date: Mon, 06 Jun 2016 02:40:28 GMT  
Server: Apache/2.4.10 (Win32) PHP/5.5.25  
X-Powered-By: PHP/5.5.25  
Content-Length: 22  
Keep-Alive: timeout=5, max=100  
Connection: Keep-Alive  
Content-Type: text/html
username=hanbo  
num=123
 
运行GET请求会出现如下结果:
----------------------------- HTTP Data ----------------------------------
GET http://192.168.2.203/index.php?username=hanbo&num=123 HTTP/1.1  
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*  
Accept-Language: en-US,zh-CN;q=0.5  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; qdesk 2.4.1265.203; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3)  
Accept-Encoding: gzip, deflate  
Host: 192.168.2.203  
Connection: Keep-Alive  
Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F
--------------------------- Data Len=644 ----------------------------------
------------------------ server retrun data -------------------------------
HTTP/1.1 200 OK  
Date: Mon, 06 Jun 2016 02:42:52 GMT  
Server: Apache/2.4.10 (Win32) PHP/5.5.25  
X-Powered-By: PHP/5.5.25  
Content-Length: 22  
Keep-Alive: timeout=5, max=100  
Connection: Keep-Alive  
Content-Type: text/html
username=hanbo  
num=123
 
本文永久更新地址:http://www.linuxdiyf.com/linux/27405.html