用socket下载http文件弄了几天,总算是整理清楚了。其间遇到很多小问题,看来写的代码还是太少啊。
因为是使用socket,所以函数部分全部用了ANSI,而没有用宏了。这也是目前是用socket不太方便的地方。
说下文件写入时需注意的地方,文件路径参数,如果为NULL直接在屏幕输出,文件存在,首先清空。recv接收数据的时候,传参需注意,接收最大的长度,一定要比接收数据数组的长度小一,不然数组最后一个字节不是结束符会产生溢出。用fwrite写文件的时候,写一次就的关闭一次,fwrite不能用同一个FILE指针连续的写。而对fwrite传参也许要注意。读取数组到文件的长度,不能用strlen,也不能使用sizeof,只能用recv返回的接收数据长度。
需要注意的也就是些maxsize参数要注意的,其他的还好吧。下面贴代码:
HttpSocketDownLoad.h
- #pragma once
- #include <WinSock2.h>
-
- long fnReceive(const SOCKET m_s, char* pBuffer,const long nMaxLength);
- int fnResponseHeader(const SOCKET sConnectSocket,
- char *szResponseHeader, const int nResponseHeaderLen);
- bool fnSetSockOptTime(const SOCKET sConnectSocket, const int &nTime);
- int fnFormatRequestHeader(char *szRequestHeader,
- const int nRequestHeaderLen, const char *pServer, const char *pObject,
- const char *pCookie = NULL, const char *pReferer = NULL,
- const long nFrom = 0, const long nTo = 0);
-
-
- int fnGetFieldValue(const char *szRequestHeader,
- const char *szSession, char *szValue, const int nMaxLen);
- int fnDownloadFile(const SOCKET sConnectSocket,
- const long nFileSize, const char *szSavaFilePath = NULL);
Code.h
- #include "stdafx.h"
- #include "HttpSocketDownLoad.h"
-
- int fnResponseHeader(const SOCKET sConnectSocket,
- char *szResponseHeader, const int nResponseHeaderLen)
- {
- char c = 0;
- int nIndex = 0;
- BOOL bEndResponse = FALSE;
- while(!bEndResponse && nIndex < nResponseHeaderLen)
- {
- recv(sConnectSocket, &c, 1, 0);
- szResponseHeader[nIndex++] = c;
- if(nIndex >= 4)
- {
- if(szResponseHeader[nIndex - 4] == '\r'
- && szResponseHeader[nIndex - 3] == '\n'
- && szResponseHeader[nIndex - 2] == '\r'
- && szResponseHeader[nIndex - 1] == '\n')
- bEndResponse = TRUE;
- }
- }
- return nIndex;
- }
-
- bool fnSetSockOptTime(const SOCKET sConnectSocket, const int &nTime)
- {
- DWORD dwErr = 0;
- dwErr=setsockopt(sConnectSocket, SOL_SOCKET,
- SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));
- if(dwErr)
- {
- return false;
- }
- else
- {
- return true;
- }
- }
-
- int fnFormatRequestHeader(char *szRequestHeader,
- const int nRequestHeaderLen, const char *pServer,
- const char *pObject,const char *pCookie,
- const char *pReferer, const long nFrom, const long nTo)
- {
- char szTemp[20];
-
- strcat_s(szRequestHeader, nRequestHeaderLen, "GET ");
- strcat_s(szRequestHeader, nRequestHeaderLen, pObject);
- strcat_s(szRequestHeader, nRequestHeaderLen, " HTTP/1.1");
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
-
- strcat_s(szRequestHeader, nRequestHeaderLen, "Host:");
- strcat_s(szRequestHeader, nRequestHeaderLen, pServer);
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
-
- if(pReferer != NULL)
- {
- strcat_s(szRequestHeader, nRequestHeaderLen, "Referer:");
- strcat_s(szRequestHeader, nRequestHeaderLen, pReferer);
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
- }
-
- strcat_s(szRequestHeader, nRequestHeaderLen, "Accept:*/*");
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
-
- strcat_s(szRequestHeader, nRequestHeaderLen,
- "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
-
- strcat_s(szRequestHeader, nRequestHeaderLen, "Connection:Keep-Alive");
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
-
- if(pCookie != NULL)
- {
- strcat_s(szRequestHeader, nRequestHeaderLen, "Set Cookie:0");
- strcat_s(szRequestHeader, nRequestHeaderLen, pCookie);
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
- }
-
- if(nFrom > 0)
- {
- strcat_s(szRequestHeader, nRequestHeaderLen, "Range: bytes=");
- _ltoa_s(nFrom, szTemp, 10);
- strcat_s(szRequestHeader, nRequestHeaderLen, szTemp);
- strcat_s(szRequestHeader, nRequestHeaderLen, "-");
- if(nTo > nFrom)
- {
- _ltoa_s(nTo, szTemp, 10);
- strcat_s(szRequestHeader, nRequestHeaderLen, szTemp);
- }
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
- }
-
- strcat_s(szRequestHeader, nRequestHeaderLen, "\r\n");
- return strlen(szRequestHeader);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int fnGetFieldValue(const char *szRequestHeader,
- const char *szSession, char *szValue, const int nMaxLen)
- {
- const char *szFindStr = strstr(szRequestHeader, szSession);
- if (szFindStr == NULL)
- {
- return -1;
- }
- int nPos = 0;
- nPos += strlen(szSession);
- nPos += 2;
- int n = 0;
- while(szFindStr[nPos] != '\r' && n < nMaxLen)
- {
- szValue[n] = szFindStr[nPos];
- n++;
- nPos++;
- }
- if (szFindStr[nPos] != '\r' || szValue[nMaxLen - 1] != '\0')
- {
- szValue[nMaxLen - 1] = '\0';
- return -1;
- }
- else
- {
- return n;
- }
- }
-
-
- int fnDownloadFile(const SOCKET sConnectSocket,
(秩名)
|