c++MFC使用socket发送http请求GET请求部分

本文详细介绍如何使用C++通过SOCKET库发送HTTP GET请求,包括Winsock初始化、DNS解析、连接服务器、构造请求头并发送,以及接收和处理响应结果的过程。

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值