#include <Windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib") #define URL_STRING_TEST "http://eng.edu-edu.com.cn/audio/Onelove.mp3" void main() { URL_COMPONENTS crackedURL; TCHAR szBuffer[1024];//这里是下载缓冲区大小 1KB大小缓冲写入一次 TCHAR szHostName[128]; TCHAR szUrlPath[256]; ZeroMemory(&crackedURL, sizeof (URL_COMPONENTS)); crackedURL.dwStructSize = sizeof (URL_COMPONENTS); crackedURL.lpszHostName = szHostName; crackedURL.dwHostNameLength = sizeof(szHostName); crackedURL.lpszUrlPath = szUrlPath; crackedURL.dwUrlPathLength = sizeof(szUrlPath); InternetCrackUrl(URL_STRING_TEST,(DWORD)strlen(URL_STRING_TEST),0,&crackedURL); FILE* file = fopen("Onelove.mp3", "wb"); HINTERNET hInt,hConn,hReq; //启用HTTP协议 hInt = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); //建立HTTP连接 hConn =InternetConnect(hInt,crackedURL.lpszHostName,crackedURL.nPort,NULL,NULL,INTERNET_SERVICE_HTTP,0,0); //创建一个URL请求 hReq = HttpOpenRequest(hConn, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0); char buff[64]; DWORD dwContLen = 0; DWORD dwLen; BOOL bResult = FALSE; DWORD nBytesGet = 0; BOOL bEnd = FALSE; DWORD dwRetCode = 0; DWORD dwSizeOfRq = sizeof(DWORD); dwSizeOfRq = sizeof(buff); if (HttpSendRequest(hReq,NULL,0,NULL,0) && HttpQueryInfo(hReq, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwRetCode,&dwSizeOfRq, NULL) && dwRetCode < 400) { bResult = TRUE;//true; } //查询文件大小 if (HttpQueryInfo(hReq, HTTP_QUERY_CONTENT_LENGTH, &buff, &dwSizeOfRq, NULL)) dwContLen = atol(buff); INTERNET_BUFFERS BufferIn; BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur BufferIn.Next = NULL; BufferIn.lpcszHeader = strHeader.c_str(); // 请求头 BufferIn.dwHeadersLength = strHeader.length(); BufferIn.dwHeadersTotal = 0; BufferIn.lpvBuffer = NULL; BufferIn.dwBufferLength = 0; BufferIn.dwBufferTotal = 1024; // This is the only member used other than dwStructSize BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0; */ hReq = HttpOpenRequest(hConn, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0); if (HttpSendRequest(hReq,NULL,0,NULL,0) && HttpQueryInfo(hReq, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwRetCode,&dwSizeOfRq, NULL) && dwRetCode < 400) { bResult = TRUE;//true; } bool bTrue = HttpSendRequestExA(hReq,&BufferIn,NULL,NULL,0); while(TRUE) { if (bResult) { //开始读取文件 bResult = InternetReadFile(hReq, szBuffer, sizeof(szBuffer), &dwLen); if (bResult) { cout<<"reading ... "<<(nBytesGet*100/dwContLen)<<endl; nBytesGet += dwLen; if (dwLen == 0) { bEnd = TRUE; break; } fwrite(szBuffer, 1, dwLen, file); } } else //数据接受完毕 { break; } } fclose(file); }
=================================================== POST方法上传数据(大量) #include <Windows.h> #include <WinINet.h> #include <stdio.h> BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize); #define BUFFSIZE 500 void main( int argc, char **argv ) { DWORD dwPostSize; if (argc < 4) { printf("Usage: Bigpost <Size> <Server> <Path>\n"); printf("<Size> is the number of KB to POST\n"); printf("<Server> is the server to POST to\n"); printf("<Path> is the virtual path to POST to\n"); exit(0); } if ( ((dwPostSize = strtoul(argv[1],NULL,10)) == 0) || (dwPostSize >=) ) { printf("%s is invalid size. Valid sizes are from 1 to 2047999\n",[1]); exit(0); } printf( "Test of POSTing %luKB with WinInet\n", dwPostSize); dwPostSize *= 1024; // Convert KB to bytes HINTERNET hSession = InternetOpen( "HttpSendRequestEx",, NULL, NULL, 0); if(!hSession) { printf("Failed to open session\n"); exit(0); } HINTERNET hConnect = InternetConnect(hSession, argv[2],, NULL, NULL, INTERNET_SERVICE_HTTP,NULL, NULL); if (!hConnect) printf( "Failed to connect\n" ); else { HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", argv[3], NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); if (!hRequest) printf( "Failed to open request handle\n" ); else { if(UseHttpSendReqEx(hRequest, dwPostSize)) { char pcBuffer[BUFFSIZE]; DWORD dwBytesRead; printf("\nThe following was returned by the server:\n"); do { dwBytesRead=0; if(InternetReadFile(hRequest, pcBuffer, BUFFSIZE-1,&dwBytesRead)) { pcBuffer[dwBytesRead]=0x00; // Null-terminate buffer printf("%s", pcBuffer); } else printf("\nInternetReadFile failed"); }while(dwBytesRead>0); printf("\n"); } if (!InternetCloseHandle(hRequest)) printf( "Failed to close Request handle\n" ); } if(!InternetCloseHandle(hConnect)) printf("Failed to close Connect handle\n"); } if( InternetCloseHandle( hSession ) == FALSE ) printf( "Failed to close Session handle\n" ); printf( "\nFinished.\n" ); } BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize) { INTERNET_BUFFERS BufferIn; DWORD dwBytesWritten; int n; BYTE pBuffer[1024]; BOOL bRet; BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur BufferIn.Next = NULL; BufferIn.lpcszHeader = NULL; BufferIn.dwHeadersLength = 0; BufferIn.dwHeadersTotal = 0; BufferIn.lpvBuffer = NULL; BufferIn.dwBufferLength = 0; BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0; if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0)) { printf( "Error on HttpSendRequestEx %d\n",GetLastError() ); return FALSE; } FillMemory(pBuffer, 1024, 'D'); // Fill buffer with data bRet=TRUE; for(n=1; n<=(int)dwPostSize/1024 && bRet; n++) { if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten)) printf( "\r%d bytes sent.", n*1024); } if(!bRet) { printf( "\nError on InternetWriteFile %lu\n",GetLastError() ); return FALSE; } if(!HttpEndRequest(hRequest, NULL, 0, 0)) { printf( "Error on HttpEndRequest %lu \n", GetLastError()); return FALSE; } return TRUE; } ====================================================