HTTP请求和IP/TCP

  所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了;

  HTTP是基于IP/TCP加上了网络请求的固定格式, 比如:

method
URL
Content-host
Content-Type
Content-Length

  实现GET请求

  把组合成的数据按照固定的格式发送给服务器, 服务器解析相应的格式, 然后返回服务器数据:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define IPSTR "42.121.252.58" //服务器IP地址;
#define PORT 80
#define BUFSIZE 1024 int main(int argc, char **argv)
{
int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[], str2[], buf[BUFSIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv; //创建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) {
printf("创建网络连接失败,本线程即将终止---socket error!\n");
exit();
}; bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= ){
printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
exit();
}; if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < ){
printf("连接到服务器失败,connect error!\n");
exit();
}
printf("与远端建立了连接\n");
memset(str2, , );
strcat(str2, "theDataToPost");
str=(char *)malloc();
len = strlen(str2);
sprintf(str, "%d", len); memset(str1, , );
strcat(str1, "GET /ymnets/p/6255674.html HTTP/1.1\n");
strcat(str1, "Host: www.cnblogs.com\n");
strcat(str1, "Content-Type: text/html\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
strcat(str1, "\n\n"); strcat(str1, str2);
strcat(str1, "\r\n\r\n");
printf("%s\n",str1); ret = write(sockfd,str1,strlen(str1));
if (ret < ) {
printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
exit();
}else{
printf("消息发送成功,共发送了%d个字节!\n\n", ret);
} FD_ZERO(&t_set1);
FD_SET(sockfd, &t_set1); while(){
sleep();
tv.tv_sec= ;
tv.tv_usec= ;
h= ;
printf("--------------->1");
h= select(sockfd +, &t_set1, NULL, NULL, &tv);
printf("--------------->2"); //if (h == 0) continue;
if (h < ) {
close(sockfd);
printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
return -;
}; if (h > ){
memset(buf, , );
i= read(sockfd, buf, );
if (i==){
close(sockfd);
printf("读取数据报文时发现远端关闭,该线程终止!\n");
return -;
} printf("%s\n", buf);
}
}
close(sockfd); return ;
}

  实现POST请求:

  C实现POST请求参考代码, 只要把请求类型从GET改为POST, 然后把请求的数据代入到请求头中即可:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define IPSTR "61.147.124.120"
#define PORT 80
#define BUFSIZE 1024 int main(int argc, char **argv)
{
int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[], str2[], buf[BUFSIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv; if ((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) {
printf("创建网络连接失败,本线程即将终止---socket error!\n");
exit();
}; bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= ){
printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
exit();
}; if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < ){
printf("连接到服务器失败,connect error!\n");
exit();
}
printf("与远端建立了连接\n"); memset(str2, , );
strcat(str2, "qqCode=287101329");
str=(char *)malloc();
len = strlen(str2);
sprintf(str, "%d", len); memset(str1, , );
strcat(str1, "POST /webservices/qqOnlineWebService.asmx/qqCheckOnline HTTP/1.1\n");
strcat(str1, "Host: www.webxml.com.cn\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
strcat(str1, "\n\n");
//str2的值为post的数据
strcat(str1, str2);
strcat(str1, "\r\n\r\n");
printf("%s\n",str1); ret = write(sockfd,str1,strlen(str1));
if (ret < ) {
printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
exit();
}else{
printf("消息发送成功,共发送了%d个字节!\n\n", ret);
} FD_ZERO(&t_set1);
FD_SET(sockfd, &t_set1); while(){
sleep();
tv.tv_sec= ;
tv.tv_usec= ;
h= ;
printf("--------------->1");
h= select(sockfd +, &t_set1, NULL, NULL, &tv);
printf("--------------->2"); //if (h == 0) continue;
if (h < ) {
close(sockfd);
printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
return -;
}; if (h > ){
memset(buf, , );
i= read(sockfd, buf, );
if (i==){
close(sockfd);
printf("读取数据报文时发现远端关闭,该线程终止!\n");
return -;
} printf("%s\n", buf);
}
}
close(sockfd); return ;
}

  POST请求的方式可以再改改:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define IPSTR "61.147.124.120"
#define PORT 80
#define BUFSIZE 1024 int main(int argc, char **argv)
{
int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[], str2[], buf[BUFSIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv; if ((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) {
printf("创建网络连接失败,本线程即将终止---socket error!\n");
exit();
}; bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= ){
printf("创建网络连接失败,本线程即将终止--inet_pton error!\n");
exit();
}; if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < ){
printf("连接到服务器失败,connect error!\n");
exit();
}
printf("与远端建立了连接\n"); memset(str2, , );
strcat(str2, "qqCode=287101329");
str=(char *)malloc();
len = strlen(str2);
sprintf(str, "%d", len); memset(str1, , );
strcat(str1, "POST /webservices/qqOnlineWebService.asmx/qqCheckOnline HTTP/1.1\n");
strcat(str1, "Host: www.webxml.com.cn\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
strcat(str1, "Content-Length: ");
strcat(str1, str);
strcat(str1, "\n\n");
//str2的值为post的数据
strcat(str1, str2);
strcat(str1, "\r\n\r\n");
printf("%s\n",str1); ret = write(sockfd,str1,strlen(str1));
if (ret < ) {
printf("发送失败!错误代码是%d,错误信息是'%s'\n",errno, strerror(errno));
exit();
}else{
printf("消息发送成功,共发送了%d个字节!\n\n", ret);
} FD_ZERO(&t_set1);
FD_SET(sockfd, &t_set1); tv.tv_sec= ;
tv.tv_usec= ;
h= ; while(){
sleep();
printf("--------------->1");
h = select(sockfd +, &t_set1, NULL, NULL, &tv);
printf("--------------->2");
//if (h == 0) continue;
if (h == -) {
close(sockfd);
printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");
return -;
};
if ( FD_ISSET(sockfd, &t_set1) ){
memset(buf, , );
i= read(sockfd, buf, );
if (i==){
close(sockfd);
printf("读取数据报文时发现远端关闭,该线程终止!\n");
return -;
}
printf("%s\n", buf);
}
}
close(sockfd); return ;
}

  请求一个HTTP服务器的数据, 接收一个参数为请求的服务器IP:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
int main(int argc, char *argv[]){
if(argc!=){
printf("error usage %s ip\n",argv[]);
return ;
}
int sockfd;
int len;
struct sockaddr_in address;
int result;
char httpstring[];
sprintf(httpstring,"GET / HTTP/1.1\r\n"
"Host: %s\r\n"
"Connection: Close\r\n\r\n",argv[]);
char ch;
sockfd = socket(AF_INET, SOCK_STREAM, );
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(argv[]);
address.sin_port = htons();
len = sizeof(address);
result = connect(sockfd,(struct sockaddr *)&address,len);
if(result == -){
perror("oops: client");
return ;
}
write(sockfd,httpstring,strlen(httpstring));
while(read(sockfd,&ch,)){
printf("%c", ch);
}
close(sockfd);
printf("\n");
return ;
}

  使用gcc编译以后执行: sudo ./req 42.121.252.58

  参考:

  Linux下用c语言实现发送http请求 方式可以Get或者Post:http://www.oschina.net/code/snippet_176076_5908/

C++:C语言实现HTTP的GET和POST请求的更多相关文章

  1. Go语言之高级篇beego框架之请求数据处理

    1.Controller中数据参数处理 获取参数:我们经常需要获取用户传递的数据,包括 Get.POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据: GetStri ...

  2. Go语言封装Http协议GET和POST请求

    本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...

  3. [译]MVC网站教程(一):多语言网站框架

    本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...

  4. 用c语言实现http请求

    用c语言来实现一个简单的http请求,请求 www.cnblogs.com 首页 #include<stdio.h> #include<stdlib.h> #include&l ...

  5. 转:在ASP.NET MVC中通过URL路由实现对多语言的支持

    对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎 ...

  6. 11. Go 语言网络编程

    Go 语言网络编程 Go语言在编写 web 应用方面非常得力.因为目前它还没有 GUI(Graphic User Interface 图形化用户界面)的框架,通过文本或者模板展现的 html 界面是目 ...

  7. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

  8. web服务器和后端语言的关系

    1.web服务nginx和php的相互关系  : https://www.cnblogs.com/luckylihuizhou/p/6387171.html 个人理解:web服务器本身没有处理后端语言 ...

  9. C语言学习笔记---3.字符串格式化输入输出

    1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...

随机推荐

  1. 【poj解题】3663

    排序, 遍历,需要裁减 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX ...

  2. C++异常第二篇---C++标准库异常类exception的使用

    1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...

  3. NMEA协议 上位机 C# (转)

    源:NMEA协议 上位机 c# 前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录.和大家分享,也为了以后不会忘记. NMEA协议总体来说,相对简单,是气象上比较成熟的协议. 主要有以下 ...

  4. Codeforces#362

    A题 题意:给定一串数列,t,t+s,t+s+1,t+2s,t+2s+1......问某一个数是否是数列当中的 题意:只需判断(x-t)与(x-t-1)能否整除s即可,注意起始时的判断 #includ ...

  5. 【亲测】Python:解决方案:Python Version 2.7 required, which was not found in the registry

    好久不更新随笔了,今天因为数据可视化作业,想抓取一些人人网好友关系数据,于是开始尝试python,用到numpy模块,安装的时候提示: 'Python Version 2.7 required, wh ...

  6. CABasicAnimation 基本动画 分类: ios技术 2015-07-16 17:10 132人阅读 评论(0) 收藏

    几个可以用来实现热门APP应用PATH中menu效果的几个方法 +(CABasicAnimation *)opacityForever_Animation:(float)time //永久闪烁的动画 ...

  7. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  8. Linux内核探索之路——关于方法

    转载自:http://blog.chinaunix.net/uid-20608849-id-3014502.html   Linux内核实践之路 -给那些想从Linux内核找点乐趣的人 一个不能回避的 ...

  9. 继续PHP

    2014-04-08 09:44:43 继续PHP. 邵杨继续回来 工作,安卓还是交给他.

  10. UVa 10670 - Work Reduction

    题目大意:对n份文件进行处理使其减少到m份,有l个机构可供选择.每个机构提供两种方案:每减少一份收费a元,或者减少到文件数量的一半收费b元.根据各个机构收取费用进行排序. 很直接的题目,直接进行模拟就 ...