使用socket发送http请求(GET/POST)

使用socket发送http请求(GET/POST)

下载LOFTER客户端

1.socket的原理 在相关文章中已经提及,不再赘述。

2.http头的格式

(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

3.示例程序

int main()
{
 int sockfd;
 int len;
 struct sockaddr_in address; 
 struct hostent *server;

int result;
//club.edu.sina.com.cn/bbs/forum-209-1.html
 string path("/TJUBBS/bbslogin?id=zongyuan&pw=91117891");
 string host("bbs.tju.edu.cn");
 stringstream stream;
 //GET请求方式
 /*
 stream<< "GET " << path << " HTTP/1.0\r\n"
         << "Host: " << host << "\r\n"
         <<"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n"
         <<"Connection:close\r\n"
          << "\r\n";
 */
 //POST请求方式
 char *post_content = new char[128];
 memcpy(post_content,"id=*********&pw=*********",128);
 int content_length = strlen(post_content);
 cout<<"content length is "<<content_length<<endl;
 stream<< "POST " << path << " HTTP/1.0\r\n"
            << "Host: " << host << "\r\n"
           <<"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n"
           <<"Content-Type:application/x-www-form-urlencoded\r\n"
           <<"Content-Length:"<<content_length<<"\r\n"
           <<"Connection:close\r\n"
           << "\r\n"
           <<post_content;

delete[] post_content;

string request = stream.str();

sockfd = socket(AF_INET,SOCK_STREAM,0);

address.sin_family = AF_INET;
 server = gethostbyname(host.c_str()); 
 memcpy((char *)&address.sin_addr.s_addr,(char*)server->h_addr, server->h_length);
 address.sin_port = htons(80);
 len = sizeof(address);

result = connect(sockfd,(struct sockaddr *)&address,len);
 
 if(result==-1){
        cout<<"connection error!"<<endl; 
 }

write(sockfd,request.c_str(),request.size());

char buf[1024*1024];
 memset(buf,0,1024*1024);
 int offset = 0;
 int rc;
 while(rc = read(sockfd,buf+offset,1024)){
      offset += rc;
 }
 
 close(sockfd);

buf[offset] = 0;
// cout<<strlen(buf)<<endl;
 cout<<buf<<endl;

/*
 int size = offset;
 int outlen = 2*size; //  注意编码转换之后的字符串长度会发生变化,因此此处定义为2倍长度,确保能够容纳转换之后得到的字符串

char *output = new char[outlen];

memset(output,0,outlen);

//进行编码转换,将gbk转换为utf-8
 covert("utf-8","gbk",buf,size,output,outlen);
 output[outlen] = 0;

cout<<strlen(output)<<endl;
// cout<<output<<endl;
 delete[] output;
 */

return 0;
}

//使用libiconv库实现的编码转换函数

int covert(char *desc, char *src, char *input, size_t ilen, char *output, size_t olen)
{
    char **pin = &input;
    char **pout = &output;
    iconv_t cd = iconv_open(desc, src);
    if (cd == (iconv_t)-1)
    {
  iconv_close(cd);
        return -1;
    }
    memset(output, 0, olen);
    if (iconv(cd, pin, &ilen, pout, &olen)){
  cout<<"convert failed!"<<endl;
  iconv_close(cd);
  return -1;
 }
    iconv_close(cd);
    return 0;
}

4.后续

访问url时经常发生页面跳转的情况,如何能够适应跳转,获取想要的页面,需要进一步学习。

时间: 2024-10-30 00:25:44

使用socket发送http请求(GET/POST)的相关文章

socket发送http请求

转自:思齐-socket发送http请求 socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r

c/c++ socket发送http请求访问网站

这几天课比较少,校园网上网要认证才能上网,每次必须输入学号密码,为了方便,写了一个自动登录以及如果在线,登录自服务系统强制下线的小工具. 强制下线思路:获取sessionID---------->获取验证码图片------------>AspriseOCRLib识别验证码--------------->MD5加密.url Encode---------------->登录自服务系统---------------->强制下线--------------------->退出

PHP + Socket 发送http请求进而实现网站灌水

本质上实现组装http信息的请求行,头信息,主题信息,参考it自学网 cookie信息和http请求头有很大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php require('./http.class.php'); $http = new Http('http://home.verycd.com/cp.php?ac=pm&op=send&touid=0&pmid=0'); $http->setHeader('Accept: text/htm

如果使用socket发送http请求(并且编译成可以被lr调用的压力测试脚本)

#include  <unistd.h> #include  <sys/types.h>       /* basic system data types */ #include  <sys/socket.h>      /* basic socket definitions */ #include  <netinet/in.h>      /* sockaddr_in{} and other Internet defns */ #include  <

php socket 发送http请求

<?php /** * Created by PhpStorm. * User: Mch * Date: 7/8/18 * Time: 21:39 @func: parse_url http://www.tfjyzx.com/model-school.jsp?area=%E5%BC%80%E5%B0%81&school=%E5%BC%80%E5%B0%81%E5%B8%82%E7%AC%AC%E4%BA%94%E4%B8%AD%E5%AD%A6#%E5%AD%A6%E6%A0%A1%E7%A

perl6 Socket: 发送HTTP请求

sub MAIN(Str $host,Str $path, Int $port) { my $send = "GET $path HTTP/1.1\r\nHost: $host\r\n\r\n"; my $c = IO::Socket::INET.new(:host($host), :port($port)); $c.print: $send; while (my $buff = $c.recv(1024)) { say $buff.print; } $c.close; }

php 利用socket发送GET,POST请求

作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http基础的开发者阅读. 今天给大家带来的是如何利用socket发送GET,POST请求.我借用燕十八老师封装好的一个Http类给进行说明. 在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的.了解过HTT

java 常见几种发送http请求案例

1 import java.io.FileOutputStream; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.io.UnsupportedEncodingException; 7 import java.net.HttpURLConnection

Nodejs发送Post请求时出现socket hang up错误的解决办法

参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段信息(这个估计也和对方的服务器有关,对于不完成的post请求头,可能被丢弃了). 完整的代码如下(遇到类型问题的同学可以做个参考): var querystring = require('querystring') , http = require('http'); var data = query