C++ Socket 发送 http post请求

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <winsock.h>//dont forget to add wsock32.lib to linker dependencies
#pragma comment(lib,"wsock32.lib")


using namespace std;


#define BUFFERSIZE 1024 * 2
void die_with_error(char *errorMessage);
void die_with_wserror(char *errorMessage);


int main(int argc, char *argv[])
{
string request;
string response;
int resp_leng;


char buffer[BUFFERSIZE];
struct sockaddr_in serveraddr;
int sock;


WSADATA wsaData;
char* addr = "http://lordrobert.iask.in/notify?action=recharge_notify";

char *host = "192.126.91.153";
int port = 80;


char *pHttpPost = "POST %s HTTP/1.1\r\n"
"Host: %s:%d\r\n"
"Content-Type: text/plain\r\n"
"Content-Length: %d\r\n\r\n"
"%s";

//Post 参数,参数形式要看服务端如何接收。不一定是下面这样写。
char *msg = "{\"openid\": \"oG6_5wZTEUmVYF__n7TMgO1yWxFw\", \"RoomName\": \"万达201\",\"TradeNO\": \"20160718025309674\",\"balanceMoney\": 50,\"MonneyCount\": 5,\"Time\": \"20160718025309\",\"TradeType\": 1,\"return_code\":\"SUCCESS\"}";


//char* msg = "Inputs={\"WeiChartID\":\"oG6_5wZTEUmVYF__n7TMgO1yWxFw\"}";


char strHttpPost[1024] = { 0 };
sprintf_s(strHttpPost, pHttpPost, addr, host, port, strlen(msg), msg);


/*
request += "GET /test.html HTTP/1.0\r\n";
request += "Host: www.zedwood.com\r\n";
request += "\r\n";
*/


//init winsock
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
{
die_with_wserror("WSAStartup() failed");
printf("WSAStartup failed:%d", GetLastError());
}

//open socket
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
die_with_wserror("socket() failed");


//connect
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(host);
serveraddr.sin_port = htons((unsigned short)port);
if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
die_with_wserror("connect() failed");


//send request
//send(sockClient, strHttpPost, strlen(strHttpPost), 0);


int a = send(sock, strHttpPost, strlen(strHttpPost), 0);
/*
if (send(sock, strHttpPost, strlen(strHttpPost), 0) != request.length())
die_with_wserror("send() sent a different number of bytes than expected");




if (send(sock, request.c_str(), request.length(), 0) != request.length())
die_with_wserror("send() sent a different number of bytes than expected");
*/
//get response
response = "";
resp_leng = BUFFERSIZE;
while (resp_leng == BUFFERSIZE)
{
resp_leng = recv(sock, (char*)&buffer, BUFFERSIZE, 0);
if (resp_leng > 0)
response += string(buffer).substr(0, resp_leng);
//note: download lag is not handled in this code
}


//display response
cout << response << endl;


//disconnect
closesocket(sock);


//cleanup
WSACleanup();
return 0;
}


void die_with_error(char *errorMessage)
{
cerr << errorMessage << endl;
exit(1);
}


void die_with_wserror(char *errorMessage)
{
cerr << errorMessage << ": " << WSAGetLastError() << endl;
exit(1);
}
C++中,使用Boost库发送HTTP POST请求通常涉及到Boost.Asio库,这是一个高性能的异步I/O库。以下是一个简单的步骤说明如何使用Boost.Asio发送POST请求: 1. 首先,确保已经安装了Boost库,特别是Boost.Asio和Boost.Filesystem。如果没有,可以从官网下载并安装。 2. 包含必要的头文件: ```cpp #include <boost/asio.hpp> #include <boost/asio/spawn.hpp> #include <boost/asio/streambuf.hpp> #include <boost/algorithm/hex.hpp> #include <boost/filesystem.hpp> ``` 3. 创建一个异步客户端实例,设置POST数据: ```cpp std::string post_data = "your_post_data"; boost::asio::ip::tcp::resolver resolver(io_service); boost::asio::ip::tcp::resolver::query query("example.com", "http"); boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); ``` 4. 创建异步连接和写入POST数据: ```cpp boost::asio::streambuf request; request << "POST / HTTP/1.1\r\n" << "Host: example.com\r\n" << "Content-Type: application/x-www-form-urlencoded\r\n" << "Content-Length: " << post_data.size() << "\r\n" << "\r\n" << post_data; auto connect_handler = boost::bind(&send_request, io_service, socket_, endpoint_iterator, request, response); auto connect_op = spawn(io_service, connect_handler); ``` 这里`send_request`是一个自定义函数,负责处理连接、写入数据以及接收响应。 5. 处理响应: ```cpp void send_request(boost::asio::io_service& io_service, boost::asio::ip::tcp::socket& socket_, boost::asio::ip::tcp::resolver::iterator endpoint_iterator, boost::asio::streambuf& request, std::string& response) { // 发送请求 boost::asio::async_write(socket_, request, boost::bind(&handle_write, io_service, socket_, endpoint_iterator, request, response, _1, _2)); // 接收响应 boost::asio::async_read_until(socket_, response, "\r\n\r\n", boost::bind(&handle_read, io_service, socket_, endpoint_iterator, response, _1, _2)); } // ...处理完成标志和响应数据的方法(handle_write和handle_read) ``` 6. 最后,在适当的`handle_write`和`handle_read`方法中处理完成标志和响应数据。 注意:这只是一个基础示例,实际使用时可能需要处理异常,并且可能需要更复杂的错误处理和日志记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值