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
版權聲明:本文為部落客原創文章,轉載請附上博文連結!