#include   <stdio.h>
 #include   "winsock.h"
 #pragma   comment(lib,"ws2_32.lib")
 #define   winsock_version   0x0101
void main()
{

SOCKADDR_IN saServer;
LPHOSTENT lphostent;
WSADATA wsadata;
SOCKET hsocket;
int nRet;
const char* host_name = "www.baidu.com";
char* req = "GET / HTTP/1.1\r\n"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight, application/vnd.ms-excel\r\n"
"Accept-Language: zh-cn\r\n"
"UA-CPU: x86\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)\r\n"
"Host: www.baidu.com\r\n"
"Connection: Keep-Alive";


if (WSAStartup(winsock_version, &wsadata))
printf("can't   initial   socket");
lphostent = gethostbyname(host_name);
if (lphostent == NULL)
printf("lphostent   is   null");
hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saServer.sin_family = AF_INET;

saServer.sin_port = htons(80);
saServer.sin_addr = *((LPIN_ADDR) * lphostent->h_addr_list);
nRet = connect(hsocket, (LPSOCKADDR) & saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
printf("can't   connect");
closesocket(hsocket);
return ;
}
else
printf("connected   with   %s\n", host_name);
nRet = send(hsocket, req, strlen(req), 0);
if (nRet == SOCKET_ERROR)
{
printf("send()   failed");
closesocket(hsocket); }
else
printf("send()   OK\n");
char dest[10000];
nRet = 1;
while (nRet > 0)
{
nRet = recv(hsocket, (LPSTR)dest, sizeof(dest), 0);
if (nRet > 0)
dest[nRet] = 0;
else
dest[0] = 0;
printf("\nReceived   bytes:%d\n", nRet);
printf("Result:\n%s", dest);
}
}

如题,我用网络嗅探器也探测到成功发送了GET请求数据,但是recv()的字节是0,琢磨了很久还是搞不明白,谢谢大家帮我看看。

解决方案 »

  1.   

    1,现确认请求的格式没有错误
    2,把while循环改为while(1),多收几次看看。
      

  2.   

    请求的格式是我复制嗅探器捕获的浏览器发送的请求数据,但把cookie省略掉了;
    按照您说的改为while(1)之后,则是反复地recieve 0byte,麻烦您再帮我看看。
      

  3.   

    请求包最后好像要以连续两个换行"\r\n\r\n"结束.建议试试,不确定!
      

  4.   

    我按照lzg0001前辈的方法改正之后的确有了效果的,显示接收到了数据,但不知道为什么显示不出来
    以下是运行的结果,帮忙看看!connected   with   www.baidu.com
    send()   OKReceived   bytes:372
    Result:
    HTTP/1.1 200 OK
    Date: Wed, 16 Jan 2008 02:37:52 GMT
    Server: BWS/1.0
    Content-Length: 1559
    Content-Type: text/html
    Cache-Control: private
    Expires: Wed, 16 Jan 2008 02:37:52 GMT
    Content-Encoding: gzip
    Set-Cookie: BAIDUID=0373638A8AC028C7AF0DB06651D1C5CC:FG=1; expires=Wed, 16-Jan-3
    8 02:37:52 GMT; path=/; domain=.baidu.com
    P3P: CP=" OTI DSP COR IVA OUR IND COM "
    Received   bytes:1559
    Result:
    ?
    Received   bytes:0
    Result:
    请按任意键继续. . .
      

  5.   

    telnet www.baidu.com 80
    然后输入
    GET / HTTP/1.1
    Host:www.baidu.com结束的两个回车是必须的
    之后就能看到结果了
    你的程序也发这样的字符串就行.
      

  6.   

    加上 \r\n\r\n 后 代码没有问题,完全可以显示。
      

  7.   

    Accept-Encoding:   gzip,   deflate把这个去掉,否则服务器返回的数据是压缩过的
      

  8.   

    抓个包 先看看 服务器有 返回给你吗?
    再 去看你的get 语句是否有错。
      

  9.   

    非常感谢kingwkb前辈,的确显示了代码,但是我复制保存为.html格式后,为什么不能正常显示网页呢?
      

  10.   

    你先在cmd命令行下telnet上去,发送get,如果能够返回网页,那么再按照这个顺序来写程序
      

  11.   

    但是我复制保存为.html格式后,为什么不能正常显示网页呢?
    ----------------------
    你的网页带有图片之类的吧,那些图片你得到没?
      

  12.   

    就是百度的主页,就LOGO一张图片,但是那代码显示得很乱,还没搞明白怎么回事。
      

  13.   

    代码接收完整没有? 如果你熟悉HTML语言,可以自己检查一下,有完整的<HTML>...</HTML> ,<BODY>...</BODY> ,<HEAD>...</HEAD> 等标签没有??
      

  14.   

    我看了一下,代码是完整的,但是我从cmd里面复制到记事本之后,有些标签明明有,但是我用搜索,竟然搜不到这个这个标签。