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
版权声明:本文为博主原创文章,转载请附上博文链接!