SOCKET 模拟HTTP客服端
HTTP 请求头部分析(详细的看代码,自己抓包分析)
GET http://www.baidu.com/ HTTP/1.1
Accept: */*
Host: 58.217.200.15
步骤:1:建立socket套接字,并连接http服务器
2:发送http请求
3:接受数据
int getpageHttp(const char* host_addr, const int host_port)
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
{
cout<<"windows socket startup failed"<<endl;
return -1;
}
sockaddr_in myaddr;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(host_port);
myaddr.sin_addr.S_un.S_addr = inet_addr(host_addr); //web服务器的ip地址,58.217.200.15 为百度的ip地址
memset(&(myaddr.sin_zero), 0, sizeof(myaddr.sin_zero));
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
cout<<"create socket failed"<<endl;
return -1;
}
if (connect(sock, (struct sockaddr*)&myaddr, sizeof(struct sockaddr)) == -1)
{
cout<<"connect function failed"<<endl;
}
//下面是http头的格式,其中GET是请求方法,不可缺少,其余参数可以参考相关文档 ,本人是抓包获取的
string sendData = "GET HTTP/1.1 /r/n";
sendData += "HOST: www.baidu.com /r/n"; //这里时百度的
sendData += "Connection: Keep-Alive /r/n";
sendData += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8/r/n";
sendData += "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36/r/n";
sendData += "Referer: http:///baidu.com// /r/n";
sendData += "Accept-Encoding: gzip,deflate,sdch/r/n";
sendData += "Accept-Language: zh-CN,zh;q=0.8,en;q=0.6/r/n";
sendData += "Cookie: BAIDUID=B18373DE96539D7D60F9515B9EBBAC43:FG=1; BD_TMP_CK=true; BDUSS=5pTWhVQmJTSzU5ZXVFUE1jNTRNaXpGanVITDhNZ3VBOS1IekdweTRFVmpsTmRTQVFBQUFBJCQAAAAAAAAAAAEAAADyv1YRc3VhbmZhamluZ3NhaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMHsFJjB7BSMn; H_PS_LC=22_3; cflag=65535:1; H_PS_TIPCOUNT=5; H_PS_TIPFLAG=; BD_CK_SAM=1; H_PS_PSSID=4788_1456_4666_4263_4759_4678/r/n";
sendData += "/r/n";
char buf[64];
FILE *f;
if( (f=fopen("1.data","w"))==NULL)
{
cout<<"file not open"<<endl;
return 0;
}
if (send(sock, sendData.c_str(), sendData.length(), 0) == -1)
{
cout<<"send function failed"<<endl;
return -1;
}
cout<<"开始接受数据"<<endl;
while(recv(sock, buf, 64, 0) > -1)
{
//cout<<"获取数据中"<<endl;
fwrite(buf,sizeof(char),64,f);
}
return 0;
}