织梦CMS - 轻松建站从此开始!

罗索

用Socket下载Http文件

jackyhwei 发布于 2010-09-22 17:33 点击:次 
用socket下载http文件弄了几天,总算是整理清楚了。其间遇到很多小问题,看来写的代码还是太少啊。因为是使用socket,所以函数部分全部用了ANSI,而没有用宏了。这也是目前是用socket不太方便的地方。
TAG:

用socket下载http文件弄了几天,总算是整理清楚了。其间遇到很多小问题,看来写的代码还是太少啊。

因为是使用socket,所以函数部分全部用了ANSI,而没有用宏了。这也是目前是用socket不太方便的地方。

说下文件写入时需注意的地方,文件路径参数,如果为NULL直接在屏幕输出,文件存在,首先清空。recv接收数据的时候,传参需注意,接收最大的长度,一定要比接收数据数组的长度小一,不然数组最后一个字节不是结束符会产生溢出。用fwrite写文件的时候,写一次就的关闭一次,fwrite不能用同一个FILE指针连续的写。而对fwrite传参也许要注意。读取数组到文件的长度,不能用strlen,也不能使用sizeof,只能用recv返回的接收数据长度。

需要注意的也就是些maxsize参数要注意的,其他的还好吧。下面贴代码:

HttpSocketDownLoad.h

  1. #pragma once  
  2. #include <WinSock2.h>  
  3.    
  4. long fnReceive(const SOCKET m_s, char* pBuffer,const long nMaxLength);  
  5. int fnResponseHeader(const SOCKET sConnectSocket,
  6.  char *szResponseHeader, const int nResponseHeaderLen);  
  7. bool fnSetSockOptTime(const SOCKET sConnectSocket, const int &nTime);  
  8. int fnFormatRequestHeader(char *szRequestHeader,
  9.  const int nRequestHeaderLen, const char *pServer, const char *pObject,  
  10.     const char *pCookie = NULL, const char *pReferer = NULL,
  11.  const long nFrom = 0, const long nTo = 0);  
  12.    
  13. //int fnGetFileSize(const char* szRequestHeader);  
  14. int fnGetFieldValue(const char *szRequestHeader,
  15.  const char *szSession, char *szValue, const int nMaxLen);  
  16. int fnDownloadFile(const SOCKET sConnectSocket,
  17.  const long nFileSize, const char *szSavaFilePath = NULL);  

Code.h

  1. #include "stdafx.h"  
  2. #include "HttpSocketDownLoad.h"  
  3.    
  4. int fnResponseHeader(const SOCKET sConnectSocket,
  5.  char *szResponseHeader, const int nResponseHeaderLen)  
  6. {  
  7.     char c = 0;  
  8.     int nIndex = 0;  
  9.     BOOL bEndResponse = FALSE;  
  10.     while(!bEndResponse && nIndex < nResponseHeaderLen)  
  11.     {  
  12.         recv(sConnectSocket, &c, 1, 0);  
  13.         szResponseHeader[nIndex++] = c;  
  14.         if(nIndex >= 4)  
  15.         {  
  16.             if(szResponseHeader[nIndex - 4] == '\r'
  17.  && szResponseHeader[nIndex - 3] == '\n'  
  18.  && szResponseHeader[nIndex - 2] == '\r'
  19.  && szResponseHeader[nIndex - 1] == '\n')  
  20.                 bEndResponse = TRUE;  
  21.         }  
  22.     }  
  23.     return nIndex;  
  24. }  
  25.    
  26. bool fnSetSockOptTime(const SOCKET sConnectSocket, const int &nTime)  
  27. {  
  28.     DWORD dwErr = 0;  
  29.     dwErr=setsockopt(sConnectSocket, SOL_SOCKET,
  30.  SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));  
  31.     if(dwErr)  
  32.     {  
  33.         return false;  
  34.     }  
  35.     else  
  36.     {  
  37.         return true;  
  38.     }  
  39. }  
  40.    
  41. int fnFormatRequestHeader(char *szRequestHeader,
  42.  const int nRequestHeaderLen, const char *pServer,
  43.  const char *pObject,const char *pCookie,
  44.  const char *pReferer, const long nFrom, const long nTo)  
  45. {  
  46.     char szTemp[20];  
  47.    
  48.     strcat_s(szRequestHeader, nRequestHeaderLen, "GET ");  
  49.     strcat_s(szRequestHeader, nRequestHeaderLen, pObject);  
  50.     strcat_s(szRequestHeader, nRequestHeaderLen, " HTTP/1.1");  
  51.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  52.    
  53.     strcat_s(szRequestHeader, nRequestHeaderLen, "Host:");  
  54.     strcat_s(szRequestHeader, nRequestHeaderLen, pServer);  
  55.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  56.    
  57.     if(pReferer != NULL)  
  58.     {  
  59.         strcat_s(szRequestHeader, nRequestHeaderLen, "Referer:");  
  60.         strcat_s(szRequestHeader, nRequestHeaderLen, pReferer);  
  61.         strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  62.     }  
  63.    
  64.     strcat_s(szRequestHeader, nRequestHeaderLen, "Accept:*/*");  
  65.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  66.    
  67.     strcat_s(szRequestHeader, nRequestHeaderLen,
  68.  "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");  
  69.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  70.    
  71.     strcat_s(szRequestHeader, nRequestHeaderLen, "Connection:Keep-Alive");  
  72.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  73.    
  74.     if(pCookie != NULL)  
  75.     {  
  76.         strcat_s(szRequestHeader, nRequestHeaderLen, "Set Cookie:0");  
  77.         strcat_s(szRequestHeader, nRequestHeaderLen, pCookie);  
  78.         strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  79.     }  
  80.    
  81.     if(nFrom > 0)  
  82.     {  
  83.         strcat_s(szRequestHeader, nRequestHeaderLen, "Range: bytes=");  
  84.         _ltoa_s(nFrom, szTemp, 10);  
  85.         strcat_s(szRequestHeader, nRequestHeaderLen, szTemp);  
  86.         strcat_s(szRequestHeader, nRequestHeaderLen, "-");  
  87.         if(nTo > nFrom)  
  88.         {  
  89.             _ltoa_s(nTo, szTemp, 10);  
  90.             strcat_s(szRequestHeader, nRequestHeaderLen, szTemp);  
  91.         }  
  92.         strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  93.     }  
  94.    
  95.     strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");  
  96.     return strlen(szRequestHeader);  
  97. }  
  98.    
  99.    
  100. //int fnGetFileSize(const char* szRequestHeader)  
  101. //{  
  102. //    const char *szSession = "Content-Length";  
  103. //    char szValue[10] = {0};  
  104. //    const char *szFindStr = strstr(szRequestHeader, szSession);  
  105. //    if (szFindStr == NULL)  
  106. //    {  
  107. //        return -1;  
  108. //    }  
  109. //    int nPos = 0;  
  110. //    nPos += strlen(szSession);  
  111. //    nPos += 2;  
  112. //    int n = 0;  
  113. //    while(szFindStr[nPos] != '\r')  
  114. //    {  
  115. //        szValue[n] = szFindStr[nPos];  
  116. //        n++;  
  117. //        nPos++;  
  118. //    }    
  119. //    return atoi(szValue);  
  120. //}  
  121.    
  122. int fnGetFieldValue(const char *szRequestHeader,
  123.  const char *szSession, char *szValue, const int nMaxLen)  
  124. {  
  125.     const char *szFindStr = strstr(szRequestHeader, szSession);  
  126.     if (szFindStr == NULL)  
  127.     {  
  128.         return -1;  
  129.     }  
  130.     int nPos = 0;  
  131.     nPos += strlen(szSession);  
  132.     nPos += 2;  
  133.     int n = 0;  
  134.     while(szFindStr[nPos] != '\r' && n < nMaxLen)  
  135.     {  
  136.         szValue[n] = szFindStr[nPos];  
  137.         n++;  
  138.         nPos++;  
  139.     }  
  140.     if (szFindStr[nPos] != '\r' || szValue[nMaxLen - 1] != '\0')  
  141.     {  
  142.         szValue[nMaxLen - 1] = '\0';  
  143.         return -1;  
  144.     }  
  145.     else  
  146.     {  
  147.         return n;  
  148.     }      
  149. }  
  150.    
  151.    
  152. int fnDownloadFile(const SOCKET sConnectSocket, (秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10194.html]
本文出处:网络 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容