天天看點

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);
}

           

作者:高德萊克

來源:CSDN

原文:https://blog.csdn.net/u013406189/article/details/77528536?utm_source=copy

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀