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. ural1628 White Streaks

    White Streaks Time limit: 1.0 secondMemory limit: 64 MB The life of every unlucky person has not onl ...

  2. CodeForces 616D Longest k-Good Segment

    用队列维护一下即可 #include<cstdio> #include<cstring> #include<queue> #include<algorithm ...

  3. bzoj1061 志愿者招募

    bzoj1061 志愿者招募 Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经 ...

  4. Github for Windows使用图文教程_西西软件资讯

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  5. JAVA中传递参数乱码问题

    url传递中文如果jsp页面,myeclipse.web.xml中org.springframework.web.filter.CharacterEncodingFilter,都是UTF-8编码,直接 ...

  6. iOS 生产证书

    首先登陆https://developer.apple.com(99美元账号) 选择iOS Developer program 板块下的 Certificates,Identifiers & ...

  7. STM32 驱动1602液晶

    利用STM32f103c8t6单片机驱动1602A液晶进行显示功能 上图即为写入信息后的效果图 本人用的是STM32的核心系统,无任何外设 库函数:3.5版本的库函数 驱动模式:采用4线驱动模式 供电 ...

  8. js实现从字符串中查找出现次数最多的字符的两种解决办法

    方法一:正则表达式匹配 var str = "adadfdfseffserfefsefseeffffftsdg"; ; var result = ""; whi ...

  9. Backbone+React使用

    1.react作为backbone的视图 2.backone和react和通信,backbone的view 渲染react组件, react组件使用backbone的collection数据 < ...

  10. TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免

    TCP的拥塞控制 1.  拥塞:即对资源的需求超过了可用的资源.若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降. 拥塞控制:防止过多的数据注入到网络中,这样 ...