HTTP自定义Header-(SOCKET-TCP)
HTTP自定义Header-TCP
前几天弄一些东西,需要在发送http请求的时候自定义http头,找了几个库用着很不爽。有的把Cookie直接干掉了,还自己在头里加了版权,最后终于忍不了了。在网上一把梭了一个TCP的,这个比较灵活,没有那么多事,THHP下面终归还是TCP:
一把梭的代码如下:
#include "HttpConnect.h"
#ifdef WIN32
#pragma comment(lib,"ws2_32.lib")
#endif
HttpConnect::HttpConnect()
{
#ifdef WIN32
//此处一定要初始化一下,否则gethostbyname返回一直为空
WSADATA wsa = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsa);
#endif
}
HttpConnect::~HttpConnect()
{
}
void HttpConnect::socketHttp(std::string host, std::string request)
{
int sockfd;
struct sockaddr_in address;
struct hostent *server;
sockfd = socket(AF_INET,SOCK_STREAM,0);
address.sin_family = AF_INET;
address.sin_port = htons(80);
server = gethostbyname(host.c_str());
memcpy((char *)&address.sin_addr.s_addr,(char*)server->h_addr, server->h_length);
if(-1 == connect(sockfd,(struct sockaddr *)&address,sizeof(address))){
DBG <<"connection error!"<<std::endl;
return;
}
DBG << request << std::endl;
#ifdef WIN32
send(sockfd, request.c_str(),request.size(),0);
#else
write(sockfd,request.c_str(),request.size());
#endif
char buf[1024*1024] = {0};
int offset = 0;
int rc;
#ifdef WIN32
while(rc = recv(sockfd, buf+offset, 1024,0))
#else
while(rc = read(sockfd, buf+offset, 1024))
#endif
{
offset += rc;
}
#ifdef WIN32
closesocket(sockfd);
#else
close(sockfd);
#endif
buf[offset] = 0;
DBG << buf << std::endl;
}
void HttpConnect::postData(std::string host, std::string path, std::string post_content)
{
//POST请求方式
std::stringstream stream;
stream << "POST " << path;
stream << " HTTP/1.0\r\n";
stream << "Host: "<< host << "\r\n";
stream << "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";
stream << "Content-Type:application/x-www-form-urlencoded\r\n";
stream << "Content-Length:" << post_content.length()<<"\r\n";
stream << "Connection:close\r\n\r\n";
stream << post_content.c_str();
socketHttp(host, stream.str());
}
void HttpConnect::getData(std::string host, std::string path, std::string get_content)
{
//GET请求方式
std::stringstream stream;
stream << "GET " << path << "?" << get_content;
stream << " HTTP/1.0\r\n";
stream << "Host: " << host << "\r\n";
stream <<"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";
stream <<"Connection:close\r\n\r\n";
socketHttp(host, stream.str());
}
调用方法:
HttpConnect *http = new HttpConnect();
http->getData("127.0.0.1", "/login", "id=liukang&pw=123");
http->postData("127.0.0.1", "/login","id=liukang&pw=123");
当时用的是GET 自动以Header,就顺便改了下,代码如下。用的时候可以根据实际情况,改改上面代码就行了。TCP的话在C++里控制Header就比较方便了。
HHHHHH.h
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include <sstream>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
class HttpConnect{
public:
HttpConnect();
~HttpConnect();
std::string socketHttp(std::string host, std::string request);
std::string getData(std::string strHost, std::string strPath, std::string strValue,
std::string strCookie, std::string strReferer
);
};
CPPPPPP.cpp
#include "stdafx.h"
#include "HttpConnect.h"
HttpConnect::HttpConnect(){
#ifdef WIN32
WSADATA wsa = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsa);
#endif
}
HttpConnect::~HttpConnect(){
}
char buf[1024 * 1024] = { 0 };//放外面,数组太大,放函数里,栈可能不够大。
std::string HttpConnect::socketHttp(std::string host, std::string request){
int sockfd;
struct sockaddr_in address;
struct hostent *server;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_port = htons(80);
server = gethostbyname(host.c_str());
memcpy((char *)&address.sin_addr.s_addr, (char*)server->h_addr, server->h_length);
if (-1 == connect(sockfd, (struct sockaddr *)&address, sizeof(address))) {
//DBG << "connection error!" << std::endl;
return "";
}
//MessageBoxA(NULL, request.c_str(), host.c_str(), MB_OK);
#ifdef WIN32
send(sockfd, request.c_str(), request.size(), 0);
#else
write(sockfd, request.c_str(), request.size());
#endif
//char buf[1024 * 1024] = { 0 };
int offset = 0;
int rc;
#ifdef WIN32
while (rc = recv(sockfd, buf + offset, 1024, 0))
#else
while (rc = read(sockfd, buf + offset, 1024))
#endif
{
offset += rc;
}
#ifdef WIN32
closesocket(sockfd);
#else
close(sockfd);
#endif
buf[offset] = 0;
//MessageBoxA(NULL , buf ,"Hi" ,MB_OK);
return std::string(buf);
}
std::string HttpConnect::getData(std::string strHost, std::string strPath, std::string strValue,
std::string strCookie , std::string strReferer
) {
//GET请求方式
std::string stream = "";
stream += "GET " + strPath + "?" + strValue;
stream += " HTTP/1.0\r\n";
stream += "Host: " + strHost + "\r\n";
stream += "Cookie: "+ strCookie +"\r\n";
stream += "Referer: "+ strReferer +"\r\n";
stream += "Connection:close\r\n\r\n";
//MessageBoxA(NULL , stream.c_str() ,"Hi" ,MB_OK);
return socketHttp(strHost, stream);
}
HTTP自定义Header-(SOCKET-TCP)的更多相关文章
- 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP
[源码下载] 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP 作者:webabcd 介绍重新想象 Windows 8 Store ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 使用Beetle简单构建高性能Socket tcp应用
beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列.除了 ...
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...
- 跨域无法获取自定义header的问题
同域的时候,header里面的参数可以随便自己定义.服务端都是可以获取的. 但是跨域的时候,除了设置 <add name="Access-Control-Allow-Origin&qu ...
- 关于socket tcp 断线重连
这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...
- ActionScript简单实现Socket Tcp应用协议分析器
转自..smark http://www.cnblogs.com/smark/archive/2012/05/15/2501507.html ActionScript简单实现Socket Tcp应用协 ...
- 基于.NET Socket Tcp的发布-订阅框架
基于.NET Socket Tcp的发布-订阅框架 一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已 ...
- 初步探究java中程序退出、GC垃圾回收时,socket tcp连接的行为
初步探究java中程序退出.GC垃圾回收时,socket tcp连接的行为 今天在项目开发中需要用到socket tcp连接相关(作为tcp客户端),在思考中发觉需要理清socket主动.被动关闭时发 ...
随机推荐
- Educational Codeforces Round 98 (Rated for Div. 2)
A 如果\(n = m\),答案为\(2 \times n\):如果\(n \ne m\),答案为\(2 \times max(n,m) - 1\) #include <bits/stdc++. ...
- 从一个想法看 FreeBSD 是商业化还是学院派
在某知名计算机网络论坛上我看到一个帖子,说自己想根据 FreeBSD 做一个移动的终端操作系统,就像安卓,苹果的 IOS 一样的. 逆向思维当初开发安卓的时候不可能没有考虑过 FreeBSD,因为无论 ...
- python对一个文本的解析
# 定义Tag的签注 controlAreaStart ="<ControlArea::黄冈>" controlAreaEnd = "</Control ...
- Python-celery的使用
安装:pip install celery pip install eventlet 需要提前安装redis. (Download, extract and compile Redis with: $ ...
- Visual Studio添加引用的方式
- 如何获取占用U盘的进程
依次打开开始---所有程序---附件---系统工具---资源监视器. 打开CPU标签栏,在"关联的句柄"中的搜索框中输入U盘的盘符,如G: 按回车搜索即可出结果. 在搜索结果中右键 ...
- Nacos 2.0 正式发布,性能提升 10 倍!!
3月20号,Nacos 2.0.0 正式发布了! Nacos 简介: 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. 通俗点讲,Nacos 就是一把微服务双刃剑:注册中心 + 配置中 ...
- 实验一 Python程序设计入门
学号20184307 2019-2020-2 <Python程序设计>实验1报告 课程:<Python程序设计> 班级: 1843 姓名: 章森洋 学号:20184307 实验 ...
- 微服务面试必问的Dubbo,这么详细还怕自己找不到工作?
大家好,我是小羽. Dubbo 起源于阿里巴巴,对于我们做电商开发的人来说,基本是首选的技术,那么为何一个区区 soa 服务治理框架,会受到这么多人的青睐呢? 今天就跟着小羽一起看看这个微服务框架之一 ...
- Android Studio 通过 ListView 学习 ArrayAdapte
ListView •前言 ListView 绝对可以称得上是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它. 由于手机屏幕空间有限,能够一次性在屏幕上显示的内容并不多,当我们的程序 ...