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. java多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 先看一下java线程运行时各个阶段的运行状态 j ...

  2. BNU OJ 50999 BQG's Approaching Deadline

    #include<cstdio> #include<algorithm> using namespace std; +; struct Homework { long long ...

  3. html5 WebSocket 与 PHP socket 聊天室原理

    html js <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. php 安装php5-mysql 拓展

    Your PHP installation appears to be missing the MySQL extension which is required by WordPress Error ...

  5. 在MyEclipse8.6中设置jQuery自动提示 - 肖飞figo的云计算专栏 - 博客频道 - CSDN.NET

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

  6. 如何获取app的素材,做出一个高仿的app

    第一步:在iTunes中搜索你想要的app,然后点击下载: 下载完成之后右键点击:在Finder中显示 在finder中右键用"归档工具打开" 会显示如下内容: "显示包 ...

  7. 四、Hbase

    一.什么情况下使用Hbase 例子: 这里Order By无时不刻的处理,我们要看到刚才的足迹,不能使用缓存技巧. 根据时间戳来查询,显然很快,应为Hbase就是以时间戳来存的. 将最近的数据放在内存 ...

  8. jqGrid的搜索框下拉

    当需要在jqGrid的搜索框里配置搜索条件时,如下拉,日期等,代码如下: datePick = function(elem) { jQuery(elem). } colNames : [ " ...

  9. ubuntu16安装KVM

    apt install qemu-kvm libvirt-bin apt install openvswitch-switch

  10. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...