C++发送HTTP请求
使用SOCKET发送HTTP的GET请求
//引入头文件和命名空间,这里的引用可能不全面,如果调试报错查看引用自行添加
#include <string>
using namespace std;
void SOCK_HTTP_GET(string m_data,string m_host,int port)
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret != 0)
{
AfxMessageBox("WSAStartup() failed!");
return;
}
//确认WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
AfxMessageBox("Invalid WinSock version!");
WSACleanup();
return;
}
///////////////////
//上面部分是初始化作用,如果没有上面初始化的步骤,下面的gethostbyname()一直返回空,所以一直报错error1
struct hostent *p_hostent=gethostbyname(m_host.c_str());
if (p_hostent==NULL)
{
//如果报错error1,证明域名或者ip地址解析错误
AfxMessageBox("error1");
return;
}
sockaddr_in addr_server;
addr_server.sin_family=AF_INET;
addr_server.sin_port=htons(port);
memcpy(&(addr_server.sin_addr),p_hostent->h_addr_list[0],sizeof(addr_server.sin_addr));
int sock =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int res =connect(sock,(sockaddr*)&addr_server,sizeof(addr_server));
if (res==-1)
{
AfxMessageBox("error2");
closesocket(sock);
return;
}
string sendData="GET "+m_data+" HTTP/1.1\r\n";
sendData+="Host:"+m_host+"\r\n";
sendData+="Connection:close\r\n";
sendData+="\r\n";
send(sock,sendData.c_str(),sendData.size(),0);
string m_readBuffer;
if (m_readBuffer.empty())
{
//请求结果的长度限定
m_readBuffer.resize(10240);
}
int readCount=recv(sock,&m_readBuffer[0],m_readBuffer.size(),0);
CString info;
info.Format("%s",m_readBuffer.c_str());
CFile myfile( "./get.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
//将请求结果写入运行路径下的get.txt文件内
myfile.Write(info,info.GetLength());
myfile.Close();
//弹窗显示请求返回的结果
AfxMessageBox(info);
closesocket(sock);
}
调用示例:
//对于一段完整的url:http://127.0.0.1:80/api/Materiel/TestGet?id=123&name=46798
//TestGet?之后的是参数,是我的服务端设置的两个参数,根据实际情况填写,为了方便可以直接缺省
//请求方式如下,第一个参数填写请求数据内容,即端口号之后这段
//第二个参数是需要访问的ip地址或者域名(例如www.baidu.com)需要注意的是这里不能加http://之类的直接根域名或者ip就行,
//第三个参数是端口号
SOCK_HTTP_GET("/api/Materiel/TestGet?id=123&name=46798","127.0.0.1",80);
本文详细介绍如何使用C++通过SOCKET库发送HTTP GET请求,包括Winsock初始化、DNS解析、连接服务器、构造请求头并发送,以及接收和处理响应结果的过程。
6408

被折叠的 条评论
为什么被折叠?



