看看以下这两个函数,那里出了问题?
char fname[255];void LogFile(char *p)
{ FILE *fp=fopen(fname,"a+");
fprintf(fp,"%s\n",p);
fclose(fp);
};BOOL HttpClient(void)
{
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
int iResult;
long lResult;
char strSubAddr[100], strBuffer[100];
lResult = WSAStartup(0x0101,&ws);
s = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("168.160.224.185"); // 计算机世界日报
    iResult=connect(s,(struct sockaddr *)&addr, sizeof(addr));
    if(SOCKET_ERROR == iResult)
    {
// 连接失败
WSACleanup();
return FALSE;
    }
    else {
// 连接成功
strcpy(strSubAddr, "GET /99/tips/ \r\n");
strcpy(fname, "index.htm");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
// 下载文件
do {
strset(strBuffer,' ');
iResult = recv(s,strBuffer,sizeof(strBuffer),0);
LogFile(strBuffer);
} while( iResult !=0 );
    }
    WSACleanup();
    
return TRUE;
}

解决方案 »

  1.   

    为什么不用WinInet而使用套接字呢?那多简单啊。
    需要用到以下几个类:
    CInternetSession;
    CHttpConnectionp;
    CHttpFile;
      

  2.   

    strcpy(strSubAddr, "GET /99/tips/ \r\n");
    strcpy(fname, "index.htm");
    iResult = send(s, strSubAddr,strlen(strSubAddr),0);
    HTTP头缺少HTTP version,host信息(会在虚拟主机上失败)比较通用的请求以HTTP://www.sina.com.cn/index.html为例GET index.html HTTP/1.0
    Host: www.sina.com.cn
      

  3.   

    to:cutestfox
        无法下载非文本文件
      

  4.   

    我觉得加个select 可能会更有效一点.
      

  5.   

    Tp: IamWhoIam(举头望明月) 
    能否具体一点?
      

  6.   

    telnet xx.xx.xx.xx 80
    之后就没有反映了
    也就没有办法使用
    GET index.htm HTTP/1.0
    怎么回事啊?
      

  7.   

    使用sniffer抓取发送的报文,分析一下报文是否正确
      

  8.   

    刚才没看.
    我以前写过一个smtp和pop3的client类,也有遇到这种情况,读取的时候读半拉儿就没有了.后来用select,一直等到超时后无反应就当成是失败.这样比较保险一点.你可以试试.
      

  9.   

    用它获取纯文本文件,一切OK!
    但是读取像.exe     .gif       .jpg     等二进制文件时只取了其中一部分,是不是写入文件的方式有问题?
      

  10.   

    真想搞清楚, 就看看RFC文档。
      

  11.   

    你的logfile是用来保存文件的阿?·······你这么做是不对的。首先接受HTTP回复,查找HTTP code看是否命令成功。
    然后查找Content-length 头,检查数据长度(如果没有该头,直接读取数据直到对方关闭连接)。
    然后应该使用2进制模式打开文件写入数据。写入数据时从第一个"\r\n\r\n"后开始写文件。
      

  12.   

    请求字符串应该是:"GET /expert/online.asp HTTP/1.1\r\nHost: www.csdn.net\r\n\r\n"
      

  13.   

    BTW: CSDN 的 IP  地址是 211.157.102.21
      

  14.   


    这个问题参考的重点恐怕不是 MSDN 吧?应该是 rfc2626 吧
      

  15.   

    同意 Kevin_qing() , 你这样写也太简单了点,至少有两个问题:
    1、HTTP的回复是有格式的,不是你发了一个GET收到的都是你想要的。
    2、LogFile有问题,它只能正确的写入文本文件,因为你用fprintf(fp,"%s",p)
      

  16.   

    嘻嘻,不懂fttp
    但想要分。。
      

  17.   

    GET /99/tips/ \r\n后再加入\r\n另外,你用telnet试一下看web服务器是否支持http1.0
      

  18.   

    TO:Kevin_qing() Kiloy(千逸) 两位大哥:  能否劳烦二位,告诉我:
       1、如何接受和写入二进制文件;
       2、如何判断接受的数据是不是二进制文件;   小弟不胜感谢!
      

  19.   

    偶也正想写一个这样的程序。
    以前发邮件给[email protected]获取rfc可以成功,现在不知为何就不行了,请问哪可得到rfc.
      

  20.   

    写文件有问题。1、必须是二进制方式,是"ab+",而不是"a+"。2、要用fwrite而不能用fprintf,fprintf不能写入二进制的0,还要指定写的字符数。
    void LogFile(char *p,int count)//count--要写的字符数
    { FILE *fp=fopen(fname,"ab+");
    fwrite(p,1,count,fp);
    fclose(fp);
    };
      

  21.   

    感谢bmzhao(二胖) :
    现在文件写入正常,但是由于设置得缓冲区是固定值,每次下载后写入文件的大小会比原文件大些,怎样将最后一次接受的数据中空白去掉?
      

  22.   

    recv返回接收的字节数,不知你是否写成LogFile(strBuffer,sizeof(strBuffer));这样写不对,应该是:
    iResult = recv(s,strBuffer,sizeof(strBuffer),0);
    LogFile(strBuffer,iResult);