使用wsock32抓一个http页面,能编译通过,能运行,就是得不到结果。

craboy1 2014-02-09 06:46:04
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"wsock32.lib")


void SendString(SOCKET sock,LPCSTR str);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
WSADATA wsaData;
SOCKET sock;
SOCKADDR_IN tcpaddr;
hostent * remoteHost;
char host[] = {"www.hao123.com"}; //主机名就直接写了
int Ret,l;
BOOL done;
int port = 80;
int chars = 0;
char buffer[512];

if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
{
MessageBox (NULL, TEXT ("msg!"), TEXT ("WSAStartup failed with error %d\n"), 0) ;
return 1;
}

if( (remoteHost = gethostbyname(host)) == NULL ) //通过主机名获取地址
{
MessageBox (NULL, TEXT ("msg!"), TEXT ("gethostbyname error!"), 0) ;
return 1;
}

sock = socket (AF_INET, SOCK_STREAM, 0);

tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons( (unsigned short)port );
tcpaddr.sin_addr.s_addr = *((unsigned long *)*remoteHost->h_addr_list); //转换地址

if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
{
MessageBox (NULL, TEXT ("msg!"), TEXT ("connect error!"), 0) ;
return 1;
}
//这里是要发送的http头部
SendString(sock,"GET / HTTP/1.1/r/n");
SendString(sock,"Host:www.hao123.com/r/n");
SendString(sock,"Accept: */*/r/n");
SendString(sock,"User-Agent: Mozilla/4.0");
SendString(sock,"(compatible; MSIE 5.00; Windows 98)/r/n");
SendString(sock,"Connection:Keep-Alive/r/n");
SendString(sock,"/r/n");
SendString(sock,"/r/n");//最后要加空行

done = FALSE;
FILE * fp;
fp = fopen("1.txt","w");
//打印并保存http响应的头部
while(!done)
{
l = recv(sock,buffer,1,0);
if(l<0)
done=TRUE;
switch(*buffer)
{
case '/r':
break;
case '/n':
if(chars==0)
done = TRUE;
chars=0;
break;
default:
chars++;
break;
}
fputc(buffer[0],fp);
}

//接收正文部分
int sum = 0;
do
{
l = recv(sock,buffer,sizeof(buffer)-1,0);
if( l < 0 )
break;
sum += l;
*(buffer + l) = 0;
fputs(buffer,fp);
} while( l > 0 );

//这里输出正文部分大小,发现其实和响应消息头部的Content-length大小是一样的
//这样就可以检查是否接受完毕


closesocket(sock);

if( WSACleanup() == SOCKET_ERROR )
{
MessageBox (NULL, TEXT ("msg!"), TEXT ("WSACleanup failed with error \n"), 0) ;
}

return 0;
}

void SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}


谁能帮调试一下?
...全文
334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
itachi777 2014-02-11
  • 打赏
  • 举报
回复
SendString(sock,"GET / HTTP/1.1/r/n");
 SendString(sock,"Host:www.hao123.com/r/n");
 SendString(sock,"Accept: */*/r/n");
 SendString(sock,"User-Agent: Mozilla/4.0");
 SendString(sock,"(compatible; MSIE 5.00; Windows 98)/r/n");
 SendString(sock,"Connection:Keep-Alive/r/n");
 SendString(sock,"/r/n");
 SendString(sock,"/r/n");//最后要加空行
这些应该一次性发出去的吧,不能分那么多次发
oyljerry 2014-02-10
  • 打赏
  • 举报
回复
估计是发的包不对,所以返回结果也不对
dffwaf23f34dssd 2014-02-09
  • 打赏
  • 举报
回复
我发现好像\r\n斜杠反了 抓下包吧 看看发出去的到底是什么

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧