在服务中、一般程序中利用 Inet 相关函数下载数据

C++ Winsock2网络编程实践:下载Demo服务器与客户端 本文还有配套的精品资源,点击获取 简介:本文介绍了使用C++和Winsock2 API编写的一个简单下载演示程序,涵盖服务器和客户端的实现。Winsock2作为Windows平台的TCP/IP通信接口,支持创建高效和可靠的网络应用。文章详细解释了基础API的使用、服务器和客户端的编程模型、非多线程处理、缺少断点续传功能、图形用户界面的潜在应用、文件传输机制、错误处理以及程序... 阅读详情
 
虽然可以使用 URLDownloadFileToXXX() 这个 API,但是,它在使用了代理的时候会遇到麻烦。
这点,Windows 自动更新发生过这样的问题:如果使用了 IE 代理,如果下载代码位于系统帐号
下,代理设置可能会失效。当然,也可以为系统帐号手动设置代理(其实就是 IE 的代理的设置
方法),不过,程序会受到很多的限制。

所以,可以考虑使用下属两个函数进行使用 - 服务程序亦可。^_^[code]//
// Download a file from the URL.
bool CHttpDownload::UrlDownloadToFile(TCHAR *ptszURL, TCHAR *ptszFilePath)
{
       
        HINTERNET                                hNet;
        HINTERNET                                hFile;
        std::string                                sProxyServer;

        DWORD                                        dwStatusCode;
        TCHAR                                        dwStatusCode1[32] = {0};
        DWORD                                        dwSize1 = sizeof(dwStatusCode1),        dwSize = sizeof(DWORD);
       
        int                                                nfilesize;                        // file size, 2GB limited. ;)

        m_sUrl = ptszURL;
        //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() ++");

        //
        if(m_ConnectionType == UseProxy)
        {
                //OutputDebugString("/n ==> Useproxy");
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_PROXY, m_sProxy.c_str(), NULL, 0);
        }
        else if(m_ConnectionType == DirectToInternet)       
        {
                //OutputDebugString("/n ==> DirectToInternet");
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
        }
        else if(m_ConnectionType == UsePreConfig)       
        {
                //OutputDebugString("/n ==> UsePreConfig");
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
        }


        if(hNet == NULL)
        {
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.1");
                return false;
        }

        hFile = InternetOpenUrl(hNet, m_sUrl.c_str(), NULL, 0, 0, 0);
        if(hFile == NULL)
        {
                InternetCloseHandle(hNet) ;
                //OutputDebugString(m_sUrl.c_str());
                //OutputDebugString(ptszURL);
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.2");

                return false;
        }
       
        BOOL bRet = HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,&dwStatusCode,&dwSize,NULL);
        if(200 != dwStatusCode)                // if URI is not exist, give up.
        {
                InternetCloseHandle(hNet) ;
                InternetCloseHandle(hFile) ;
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.3");

                return false;
        }
        if(HttpQueryInfo(hFile,HTTP_QUERY_CONTENT_LENGTH, &dwStatusCode1,&dwSize1,NULL))
        {
                nfilesize = atoi(dwStatusCode1);                // file size.
        }
       
        HANDLE hDownFile = CreateFile(ptszFilePath,
                                                                GENERIC_READ|GENERIC_WRITE,
                                                                FILE_SHARE_READ,
                                                                NULL,
                                                                CREATE_ALWAYS,
                                                                FILE_ATTRIBUTE_NORMAL,
                                                                NULL);

        if(INVALID_HANDLE_VALUE == hDownFile)
        {
                InternetCloseHandle(hNet) ;
                InternetCloseHandle(hFile) ;
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.4");

                return false;
        }

        // O.K. save file
        DWORD dwWrite, dwBytesRead = 0;
        char  bufFile[MAX_BUFFER_SIZE] = {0};
        DWORD dwSurplus = nfilesize % sizeof(bufFile);       

        while(true)
        {
                // Read File Data From Net.
                BOOL bRead = InternetReadFile(hFile, bufFile, sizeof(bufFile), &dwBytesRead);
                if(dwBytesRead == 0)                // End of file.
                        break;

                // Write file data.
                WriteFile(hDownFile, bufFile, dwBytesRead, &dwWrite,NULL);
        }

        InternetCloseHandle(hFile) ;
        InternetCloseHandle(hNet) ;
        CloseHandle(hDownFile) ;

        //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.");
        return true;
}

// Download URL contents to memory buffer.
// if pBuf == NULL, *pdwBufSize will contain the real size of remote size;
// *pdwBufSize alwayls contains the size of remote size.
bool CHttpDownload::UrlDownloadToBuffer(TCHAR *ptszURL, LPVOID pBuf, DWORD *pdwBufSize)
{
       
        HINTERNET                                hNet;
        HINTERNET                                hFile;
        std::string                                sProxyServer;
       
        DWORD                                        dwStatusCode;
        TCHAR                                        dwStatusCode1[32] = {0};
        DWORD                                        dwSize1 = sizeof(dwStatusCode1),        dwSize = sizeof(DWORD);
       
        int                                                nfilesize;                        // file size, 2GB limited. ;)
       
        m_sUrl                = ptszURL;
       
        //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() ++");
       
        //
        if(m_ConnectionType == UseProxy)
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_PROXY, m_sProxy.c_str(), NULL, 0);
        else if(m_ConnectionType == DirectToInternet)       
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
        else if(m_ConnectionType == UsePreConfig)       
                hNet = InternetOpen(tszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
       
       
        if(hNet == NULL)
        {
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.1");
                return false;
        }
       
        hFile = InternetOpenUrl(hNet, m_sUrl.c_str(), NULL, 0, 0, 0);
        if(hFile == NULL)
        {
                InternetCloseHandle(hNet) ;
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.2");
               
                return false;
        }
       
        BOOL bRet = HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,&dwStatusCode,&dwSize,NULL);
        if(200 != dwStatusCode)                // if URI is not exist, give up.
        {
                InternetCloseHandle(hNet) ;
                InternetCloseHandle(hFile) ;
                //OutputDebugString("/nCHttpDownload::UrlDownloadToFile() --.3");
               
                return false;
        }
        if(HttpQueryInfo(hFile,HTTP_QUERY_CONTENT_LENGTH, &dwStatusCode1,&dwSize1,NULL))
        {
                nfilesize = atoi(dwStatusCode1);                // file size.
               
        }
       
        char                                szBuffer[MAX_BUFFER_SIZE+1] = {0};

        if(pBuf != NULL)        // We only copy the 1st MAX_BUFFER_SIZE data to user buffer!!!
        {
                 unsigned long nSize = 0;
               
                
                BOOL bRet = InternetReadFile(hFile, szBuffer, MAX_BUFFER_SIZE, &nSize);

                 szBuffer[nSize] = '/0';

                // dump buffer.
                DWORD        dwtSize = (*pdwBufSize > nSize)? nSize: *pdwBufSize;
                memcpy(pBuf, szBuffer, dwtSize);
        }
       
        *pdwBufSize = nfilesize;

        InternetCloseHandle(hFile) ;
        InternetCloseHandle(hNet) ;

       
        return true;       
}[/code]
 
Using WinInet HTTP functions in Full Asynchronous Mode
[url]http://www.codeproject.com/internet/asyncwininet.asp[/url]

Offline Browser using WinInet, URL Moniker and MSHTML APIs
[url]http://www.codeproject.com/internet/OfflineBrowserWinInet.asp[/url]

Common HTTP and FTP WinInet APIs  
[url]http://www.dotnetheaven.com/UploadFile/mahesh/CommonHTTPandFTP05242005075834AM/CommonHTTPandFTP.aspx[/url]

[url]http://topic.youkuaiyun.com/t/20050507/16/3987488.html[/url]

Discover WIN32. How to use a sync/async retrieve HTTP content in your ASP & VB projects.
[url]http://www.codeproject.com/internet/retrievehttp.asp[/url]

HTTP Proxy download
[url]http://www.vbforums.com/archive/index.php/t-225065.html[/url]

HTTP/FTP客户端开发库:libwww、libcurl、libfetch 以及更多
[url]http://blog.youkuaiyun.com/heiyeshuwu/archive/2007/07/15/1691904.aspx
云卓遥控器+DIY高清摄像机的方案(完美接入原系统) 发云卓H16 1080P数图控三合一10公里 其中它月 阅读详情

相关推荐

通达信强龙趋势幅图指标:从强弱分析到买卖点实战指南

在股票技术分析中,趋势判断一直是交易决策的核心环节。传统指标通常依赖均线交叉或MACD金叉来确认趋势,但这种确认机制天然存在滞后性,往往等信号明确时行情已走过大半。针对这一问题,基于价格位置、量能配合和均线结构三个维度综合打分的思想逐渐受到关注,通过量化个股所处强弱区间,帮助投资者更快识别强势股与风险信号。这类强弱分析工具不仅适用于刚接触公式编辑的新手,也能为有经验的交易者提供一把可视化的“强度刻度尺”。在实际应用中,结合回踩低吸、离场判断等交易场景,能够有效提升买卖点的把握能力。本文详细解析通达信强龙趋势

weixin_29044157的博客 328

URLDownloadToFile

在服务中、一般程序中利用 Inet 相关函数下载数据[原创]虽然可以使用 URLDownloadFileToXXX() 这个 API,但是,它在使用了代理的时候会遇到麻烦。这点,Windows 自动更新发生过这样的问题:如果使用了 IE 代理,如果下载代码位于系统帐号下,代理设置可能会失效。当然,也可以为系统帐号手动设置代理(其实就是 IE 的代理的设置方法),不过,程序会受到很多的限制。 所以...

weixin_34343689的博客 268

Ubuntu下OpenOCD+GDB的安装、编译及使用

目标开发板(芯片):stm32mp157aaa 仿真器:ST-Link 操作系统:Ubuntu 18.04 调试软件:OpenOCD OpenOCD的安装 首先下载OpenOCD有多种方式,可以GitHub上下载,目录下打开终端,输入 git clone git://git.code.sf.net/p/openocd/code openocd 下载完整的OpenOCD的文件夹。进入到OpenOCD的目录下,开始安装。 接着,OpenOCD适用于微处理器的debug和烧写,需要下载相关库 sud

蓝冰露的博客 9525

inet_ntop函数的简单实现及调用

日前在学习大神之作《Unix网络编程》,并尝试将书中代码coding并运行。 今天仿写的是inet_ntop()函数,位于原书P61页,该函数可实现网络字节序的二进制值到点分十进制字符串的转换。 其中,字母n代表numeric,格式存在于套接口地址结构中的二进制值;             字母p代表presentation,格式通常是ASCII串。     以下代码为inet_ntop

hxxq1022的博客 1万+

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

本教程详细介绍了如何从零开始配置QMK固件的OLED显示屏,实现个性化键盘显示。首先,文章解释了OLED显示屏的基本概念及其在键盘中的应用,并介绍了I2C和SPI两种通信方式。接着,教程逐步指导用户如何在QMK固件中启用OLED功能,包括在rules.mk中启用OLED、在halconf.h和mcuconf.h中配置I2C功能,以及在config.h中设置I2C和OLED参数。最后,教程展示了如何在keymap.c中编写代码,实现OLED显示内容,并提供了进阶定制功能,如显示当前层信息、按键状态和QMK L

Despacito0o的博客 581

Unity之Timeline教程

Unity Timeline是Unity的一种时间轴编辑器工具,用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面,使得开发者可以通过拖放操作轻松创建和编辑时间轴。Activation Track:用于控制物体的激活状态。可以在轨道上添加关键帧,控制物体的激活和非激活状态。Animation Track:用于处理物体的动画。可以在此轨道上添加关键帧,编辑物体的动画状态。Audio Track:用于处理场景中的音频。可以管理音频的播放、暂停、淡入淡出等操作。

TxNet 9447

(转)URLDownloadToFile

在服务中、一般程序中利用 Inet 相关函数下载数据[原创] 虽然可以使用 URLDownloadFileToXXX() 这个 API,但是,它在使用了代理的时候会遇到麻烦。 这点,Windows 自动更新发生过这样的问题:如果使用了 IE 代理,如果下载代码位于系统帐号 下,代理设置可能会失效。当然,也可以为系统帐号手动设置代理(其实就是 IE 的代理的设置 方法),不过,程序会受到很多

gxj1680的专栏 953

Visual Studio调试技巧与实用方法总结(实战经验分享)

本文根据多年的项目实战经验,详细介绍一些Visual Studio常用的高效调试手段与技巧。

dvlinker的技术专栏 3万+

基于tcp的下载文件,以及struct模块的应用。

一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM)# 建立套接字 tcp_ip = input("请输入ip:") tcp_port = int(input("请输入端口:"))# 接收用输入的服务...

ancan7211的博客 149

ADS电路仿真方法综述:原理与应用

在射频与微波电路设计中,精确的仿真技术是验证性能的关键。ADS(Advanced Design System)作为行业标准工具,集成了多种仿真方法,适用于不同场景。本文将系统解析瞬态分析、谐波平衡(HB)、交流分析(AC)、直流分析(DC)、S参数、大信号SP(LSSP)及包络分析的原理、实现机制与应用场景。

u014344410的博客 482

智能车浅谈——手把手让车跑起来(电磁篇)

手把手让你的电磁车上路。

qq_41954556的博客 7万+

用Linux C实现FTP站点上文件的上传与下载

花了4天的时间了解完FTP的工作原理之后,终于在三天之后写成了一个操作FTP站点的C程序。 FTP

Donald_Shallwing的博客 8791

YOLOv改进 | YOLOv11添加WTConv小波卷积,能够更有效地捕捉局部和全局特征

在计算机视觉目标检测领域,YOLO(You Only Look Once)系列算法凭借“单阶段检测”的高效性(一次前向传播同时完成目标定位与分类),已成为工业界与学术界的主流选择。从YOLOv1到YOLOv11,算法持续迭代优化,在速度与精度之间寻求平衡,广泛应用于自动驾驶、智能安防、工业质检等场景。为解决上述问题,本文提出一种基于,将输入特征图分解为不同频率的子带(低频全局信息与高频局部细节),并分别通过卷积操作提取局部与全局特征,最后融合多尺度特征,从而更有效地捕捉目标的局部细节与全局结构。

走向CTO的路上... 1251

python写文件下载器_python基于TCP实现的文件下载器功能案例

本文实例讲述了python基于TCP实现的文件下载器功能。分享给大家供大家参考,具体如下:服务器 参考代码如下:from socket import *import sysdef get_file_content(file_name):"""获取文件的内容"""try:with open(file_name, "rb") as f:content = f.read()return contente...

weixin_39858124的博客 178

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux文件服务站

linux文件服务站定义一些命令的宏服务端serverserver.h 定义一些命令的宏 config.h #define LS 0 #define GET 1 #define PWD 2 #define IFGO 3 #define LLs 4 #define LCD 5 #define CD 6 #define PUT 7 #define QUIT 8 #define DOFILE 9 struct read { char data[1024]; int cmd; // 定义标记符号

weixin_47932709的博客 645

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

linuxC语言_用select函数或线程池两种方法制作tcp服务器[可同时接受处理多个客户端发来的指令或者处理与服务器创建新连接请求]

linuxC语言_用select函数或线程池两种方法制作tcp服务器[可同时接受处理多个客户端发发来的指令。

a812417530的博客 1390

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux ftp连接超时(10060),FTP数据连接连接远程服务器时超时,该如何处理

当前位置:我的异常网» VC/MFC»FTP数据连接连接远程服务器时超时,该如何处理FTP数据连接连接远程服务器时超时,该如何处理www.myexceptions.net网友分享于:2015-08-26浏览:227次FTP数据连接连接远程服务器时超时我碰到的问题是这样的:我用SOCKET来做一个FTP上传/下载.控制连接和数据连接在本机和局域网能都能连接上,但连接到远程FTP服务器时就...

weixin_42363510的博客 3620

树莓派仪表盘 15 FPS 救回 28 FPS:Frosted Glass Lite 主题性能优化实战

在树莓派 4B 上跑 Home Assistant,仪表盘卡片一到十几个就开始掉帧,点开关要等半秒才有反馈,整个界面明显卡顿。问题往往不在硬件,而在主题的渲染成本——Frosted Glass Lite 就是面向低配置设备做的 Frosted Glass 主题性能优化版,去掉模糊和多层阴影后,同样一组卡片的帧率能回来一大截。 ## 先看数据:三台设备的帧率变化 测试口径:10 个以上卡片的典型

gitblog_00593的博客 368

UNP读书笔记一 Socket编程的简单介绍!

一 源代码编译也是在网上找的源代码编译方法,也很简单。首先,在http://www.unpbook.com/unpv13e.tar.gz下载源代码。二 几个重要的数据结构和函数1 sockaddr和sockaddr_in结构 structsockaddr{unsignedshortsa_family;charsa_data[14];};structsockaddr_in{s...

测试 273

python服务_python的服务

一、系统和网络1、系统操作系统: (Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。2、osi七层协议osi七层:物理层数据链路层网络层传输层会话层表示层应用层tcp/ip五层:物理层数据链路层网络层传输层应用层tcp/ip四层:网络接口层网络层传输层应用层3、数据链路...

weixin_39936388的博客 200

python2环境下实现文件上传下载

开发环境 服务器:centos6.5 自带python2.6.6以及socket库 客户端:windows10 python2.7.9以及socket库,Tkinter库,MySQLdb库 运行方式 服务器:后台运行server.py脚本 客户端:运行打包的exe文件,无需要求客户端配置python环境 效果展示 功能介绍 通过查询框可以模糊匹配相关文件名并展示。 通过选择对应文件名,文件名会同步到下载输入框,点击下载即可从远程主机下载到本机D:/download(可自行更换),下载前将清空D:/dow

qq_38203551的博客 750

使用代理http协议下载flash

 为了帮网友些个用http下载动画的程序,临时在网上翻了翻,看看有没有利用http代理来下载的例子。结果,似乎很多人都愿意去转载一个有头无尾的例子,还美其名曰“我在查阅RFC文档和相关资料后,特总结一些TCP协议穿透代理服务器的程序片断,希望对大家有所帮助。”  如果真的想帮助大家,为什么不说的详细一些?  无奈之下,自己去翻rfc文档,找了些资料,写了这个利用http代理来下载文件的资料

1041

python网络通信: python套接字(socket)构造TCP下载器

前言 也是大家有时会想到,平常我们从网上下载数据的原理是什么?这些数据是从哪里来的,又为什么可以下载到自己的电脑上,其实这些都使用了一些特殊的协议,这里简单讲解一下tcp下载器功能的实现。 TCP概述 tcp介绍: tcp通信需要经过创建连接、数据传送、中止连接三个步骤。 tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中的打电话 TCP特点 1.面向连接:通...

qq_45020131的博客 371

用 VC++ 和 Winsock 实现与 HTTP 服务器通话

用 VC++ 和 Winsock 实现与 HTTP 服务器通话 作者:Ji Hong 一、引 言 ---- Windows Socket API是一套开放的、支持多种协议的Windows下的网络编程接口,它包 括一个标准的 Berkeley Socket功能调用的集合,以及为Windows所作的重要扩充。 Windows Socket经过不断完善并在众 多公司的全力

ren20的专栏 1139

TCP客户端服务器通信 recv()/send()

TCP客户端服务器通信 recv()/send()

weixin_51332399的博客 420
上一篇: XP下双开3389远程控制的源码
下一篇: 修改EXE文件图标及资源的方法
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值