Socket模拟网站交付请求,获取服务器返回信息
Socket模拟网站提交请求,获取服务器返回信息,
用过金山词霸的都知道他那个翻译功能是用户输入到他的编辑框,通过软件提交给百度的翻译页面,在截取翻译页面的返回结果实现的,我现在也想实现这个功能,在这个http://tool.chinaz.com/pagestatus/ 站点提交我的请求,然后获取返回结果,但是遇到好几个问题。贴上代码。
#include "stdafx.h"
#pragma comment(lib,"ws2_32.lib")
# define LEN 1024
int main()
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
char http[60]="tool.chinaz.com"; //问题地点1
if(WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sclient == INVALID_SOCKET)
{
printf("invalid socket !");
return 0;
}
sockaddr_in serAddr;
hostent *host=gethostbyname(http); //取得主机IP地址
int i;
int n;
for(i=0;;i++)
{
if(host->h_addr_list[i] != NULL)
{
// printf("IP: %s\n",inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
n=i;
break;
}
}
memcpy(&serAddr,host->h_addr_list[n],sizeof(serAddr));
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(80);
serAddr.sin_addr.S_un.S_addr=inet_addr(inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
//serAddr.sin_addr.S_un.S_addr = inet_addr("113.107.161.56");
char buf[LEN]="POST /pagestatus/ HTTP/1.1 "; //构造HTTP请求数据包
strcat(buf,inet_ntoa(serAddr.sin_addr)); //问题地方2
strcat(buf,"Referer: http://tool.chinaz.com/pagestatus/");
strcat(buf,"Accept-Language: zh-CN");
strcat(buf,"\r\nContent-Length: 10\r\n\r\n");
strcat(buf,"Connection:close");
int time = 1000; //超时时间
setsockopt(sclient,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time));
if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("connect error !");
closesocket(sclient);
return 0;
}
send(sclient,buf, strlen(buf)+1, 0);
char recData[1024];
while(true)
{
int ret = recv(sclient, recData,LEN, 0);
if(ret > 0)
{
// recData[ret] = 0x00;
printf(recData);
}
}
closesocket(sclient);
WSACleanup();
return 0;
}
1. char http[60]="tool.chinaz.com"; 这样写的话 hostent *host=gethostbyname(http); //取得主机IP地址 这里才能正确获取IP memcpy(&serAddr,host->h_addr_list[n],sizeof(serAddr)); 这里才能执行正确,
如果char http[60]="tool.chinaz.com/pagestatus"; 这样写hostent *host=gethostbyname(http); 这里就会错误 host不能正确获取,下面也就不能正确执行。
2 send(sclient,buf, strlen(buf)+1, 0); 这里发送什么样的数据才能获取我需要的查询结果,我也很迷茫,我用抓包工具抓了他的封包,然后模拟了一个他发送的封包,但是不晓得对不对, 各位大牛帮我看看到底咋个搞。。。
如果直接给出解决方案的代码的,表示万分感谢,
------解决思路----------------------
建议楼主先学会使用抓包软件比如wireshark
------解决思路----------------------
这种问题别用c++写啊,用php开发多简单啊。
你说的乱码问题,估计跟编码格式有关,使用GB2312编码格式时。
一般html头部会加上
php返回的页面会加上
VC还真不知道怎么设置,百度下吧。
用过金山词霸的都知道他那个翻译功能是用户输入到他的编辑框,通过软件提交给百度的翻译页面,在截取翻译页面的返回结果实现的,我现在也想实现这个功能,在这个http://tool.chinaz.com/pagestatus/ 站点提交我的请求,然后获取返回结果,但是遇到好几个问题。贴上代码。
#include "stdafx.h"
#pragma comment(lib,"ws2_32.lib")
# define LEN 1024
int main()
{
WORD sockVersion = MAKEWORD(2,2);
WSADATA data;
char http[60]="tool.chinaz.com"; //问题地点1
if(WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sclient == INVALID_SOCKET)
{
printf("invalid socket !");
return 0;
}
sockaddr_in serAddr;
hostent *host=gethostbyname(http); //取得主机IP地址
int i;
int n;
for(i=0;;i++)
{
if(host->h_addr_list[i] != NULL)
{
// printf("IP: %s\n",inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
n=i;
break;
}
}
memcpy(&serAddr,host->h_addr_list[n],sizeof(serAddr));
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(80);
serAddr.sin_addr.S_un.S_addr=inet_addr(inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));
//serAddr.sin_addr.S_un.S_addr = inet_addr("113.107.161.56");
char buf[LEN]="POST /pagestatus/ HTTP/1.1 "; //构造HTTP请求数据包
strcat(buf,inet_ntoa(serAddr.sin_addr)); //问题地方2
strcat(buf,"Referer: http://tool.chinaz.com/pagestatus/");
strcat(buf,"Accept-Language: zh-CN");
strcat(buf,"\r\nContent-Length: 10\r\n\r\n");
strcat(buf,"Connection:close");
int time = 1000; //超时时间
setsockopt(sclient,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time));
if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("connect error !");
closesocket(sclient);
return 0;
}
send(sclient,buf, strlen(buf)+1, 0);
char recData[1024];
while(true)
{
int ret = recv(sclient, recData,LEN, 0);
if(ret > 0)
{
// recData[ret] = 0x00;
printf(recData);
}
}
closesocket(sclient);
WSACleanup();
return 0;
}
1. char http[60]="tool.chinaz.com"; 这样写的话 hostent *host=gethostbyname(http); //取得主机IP地址 这里才能正确获取IP memcpy(&serAddr,host->h_addr_list[n],sizeof(serAddr)); 这里才能执行正确,
如果char http[60]="tool.chinaz.com/pagestatus"; 这样写hostent *host=gethostbyname(http); 这里就会错误 host不能正确获取,下面也就不能正确执行。
2 send(sclient,buf, strlen(buf)+1, 0); 这里发送什么样的数据才能获取我需要的查询结果,我也很迷茫,我用抓包工具抓了他的封包,然后模拟了一个他发送的封包,但是不晓得对不对, 各位大牛帮我看看到底咋个搞。。。
如果直接给出解决方案的代码的,表示万分感谢,
------解决思路----------------------
建议楼主先学会使用抓包软件比如wireshark
------解决思路----------------------
这种问题别用c++写啊,用php开发多简单啊。
你说的乱码问题,估计跟编码格式有关,使用GB2312编码格式时。
一般html头部会加上
<meta content="text/html; charset=gb2312" http-equiv="content-type" />
php返回的页面会加上
header('Content-Type:text/html;charset=GB2312');
VC还真不知道怎么设置,百度下吧。