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. SQL Server 事务及回滚事务的几种方法

    第一种: declare   @iErrorCount   int set@iErrorCount=0 begintran Tran1    insertinto t1(Id, c1) values( ...

  2. IWorkSpace接口介绍 1.打开各种数据库

    IWorkspace接口提供访问工作空间的通用属性和方法,如它的连接属性,以及包含的数据集的方法. IWorkspace的成员字段: Members   Description ConnectionP ...

  3. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

  4. iReport使用教程

    http://www.blogjava.net/keweibo/articles/239492.html 原创出处 http://blog.163.com/liushuo216@126/blog/st ...

  5. libthread_db

    http://timetobleed.com/notes-about-an-odd-esoteric-yet-incredibly-useful-library-libthread_db/

  6. [SQLite]SQL语法

    SQLite常用SQL语句 创建表格 sql="CREATE TABLE IF NOT EXISTS MusicList (id integer primary key AutoIncrem ...

  7. Response.Write() Alert后页面布局改变

    根据peter_zhang给出的解决方案,原文URL:http://www.cnblogs.com/starxp/articles/1939032.html 使用Page.ClientScript.R ...

  8. 扩展对EasyUI的校验规则

    var myReg = RegExp(/[(\*)(\|)(\\)(\:)(\")(\/)(\<)(\>)(\?)]+/); $.extend($.fn.validatebox. ...

  9. 在GitHub上创建上传下载开源项目代码

    1.注册GitHub帐号,创建GitHub项目代码仓库 1.1.注册GitHub帐号 在使GitHub之前,需要先登录其官网注册一个免费使用的账号.登录 https://github.com/join ...

  10. VS2010环境下使用VB开发网络编程(WinHttp)

    首先点项目——>添加引用——>COM选项卡——>Microsoft WinHttp Services,version 5.1,然后点确定就可以添加Winhttp到项目引用中. 1.如 ...