c++ socket发送http请求

socket编程中往往需要目标服务器的IP地址和端口来进行通信,但是服务器的IP地址往往很难记住,从而产生了域名,例如百度的是 www.baidu.com

例如:在百度搜索域名这个词条会发现,上面的url是https://www.baidu.com/s?wd=%E5%9F%9F%E5%90%8D&rsv_spt=1&rsv_iqid=0xd7056705001ad08f&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=5&rsv_sug1=5&rsv_sug7=101&rsv_sug2=0&inputT=3878&rsv_sug4=4829

这一长串地址,而百度百科域名的词条url是https://baike.baidu.com/item/%E5%9F%9F%E5%90%8D/86062?fr=aladdin

前面xxx.com就是网站的域名,也是我们要用来解析出ip地址的,后面一堆都是要发的数据,?前是要请求的url,?后是附带的数据。

接下来就是怎么通过socket发出去了

void SendHtmlData()
{
	string m_data="/item/%E5%9F%9F%E5%90%8D/86062?fr=aladdin";		//存放url和后面数据的
 	string m_host="xxx.com";
	struct hostent *p_hostent = gethostbyname(m_host.c_str());
	if(p_hostent == NULL)
	{
		return;
	}
	sockaddr_in addr_server;
	addr_server.sin_family = AF_INET;
	addr_server.sin_port = htons(80);//如果url中没有指明端口号,就设定默认的80
	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)
	{
		cout<< "Connect failed "<<endl;close(sock); //此为linux下的socket关闭函数,windows下的为closesocket(sock)
		return;
	}
	string sendData = "GET " + m_data + " HTTP/1.1\r\n"; //如果是POST需要将数据绑在最后发送
	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(512);
	int readCount = recv(sock,&m_readBuffer[0], m_readBuffer.size(),0);
	cout<<"Request: " << m_data <<" and response:" << m_readBuffer << endl;
	close(sock);
}


作者:高德莱克
来源:优快云
原文:https://blog.youkuaiyun.com/u013406189/article/details/77528536?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值