- #include<WINDOWS.H>
- #include<WININET.H>
- #include<IOSTREAM.H>
- HANDLE hConnectedEvent, hRequestOpenedEvent, hRequestCompleteEvent;
- HINTERNET hInstance, hConnect, hRequest;
- char *lpszUrl, *lpszServer;
- BOOL bAllDone = FALSE;
- BOOL bVerbose = FALSE;
- void __stdcall Callback(HINTERNET hInternet,
- DWORD dwContext,
- DWORD dwInternetStatus,
- LPVOID lpStatusInfo,
- DWORD dwStatusInfoLen);
- void main(int argc, char *argv[])
- {
- if (argc != 3)
- {
- if ((argc == 4) && (argv[3][0] == 'v'))
- bVerbose = TRUE;
- else
- {
- cout << "Usage: asynchttp <SERVER> <URL> [v]" << endl;
- cout << " <SERVER> is the hostname of the http server" << endl;
- cout << " <URL> is the url of the object you are requesting (without the hostname)" << endl;
- cout << " 'v' for verbose output" << endl << endl;
- cout << " Example: asynchttp www.domain.com /docs/readme.htm v" << endl;
- return;
- }
- }
- lpszServer = argv[1];
- lpszUrl = argv[2];
- hConnectedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- hRequestOpenedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- hRequestCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- hInstance = InternetOpen("asynchttp",
- INTERNET_OPEN_TYPE_PRECONFIG,
- NULL,
- NULL,
- INTERNET_FLAG_ASYNC); // ASYNC Flag
- if (hInstance == NULL)
- {
- cout << "InternetOpen failed, error " << GetLastError();
- return;
- }
- // Setup callback function
- if (InternetSetStatusCallback(hInstance,
- (INTERNET_STATUS_CALLBACK)&Callback) == INTERNET_INVALID_STATUS_CALLBACK)
- {
- cout << "InternetSetStatusCallback failed, error " << GetLastError();
- return;
- }
- // First call that will actually complete asynchronously even
- // though there is no network traffic
- hConnect = InternetConnect(hInstance,
- lpszServer,
- INTERNET_DEFAULT_HTTP_PORT,
- NULL,
- NULL,
- INTERNET_SERVICE_HTTP,
- 0,
- 1); // Connection handle's Context
- if (hConnect == NULL)
- {
- if (GetLastError() != ERROR_IO_PENDING)
- {
- cout << "InternetConnect failed, error " << GetLastError();
- return;
- }
- // Wait until we get the connection handle
- WaitForSingleObject(hConnectedEvent, INFINITE);
- }
- // Open the request
- hRequest = HttpOpenRequest(hConnect,
- "GET",
- lpszUrl,
- NULL,
- NULL,
- NULL,
- INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,
- 2); // Request handle's context
- if (hRequest == NULL)
- {
- if (GetLastError() != ERROR_IO_PENDING)
- {
- cout << "HttpOpenRequest failed, error " << GetLastError();
- return;
- }
- // Wait until we get the request handle
- WaitForSingleObject(hRequestOpenedEvent, INFINITE);
- }
- if (!HttpSendRequest(hRequest,
- NULL,
- 0,
- NULL,
- 0))
- {
- if (GetLastError() != ERROR_IO_PENDING)
- {
- cout << "HttpSendRequest failed, error " << GetLastError();
- return;
- }
- }
- if (bVerbose)
- {
- cout << "HttpSendRequest called successfully" << endl;
- cout.flush();
- }
- WaitForSingleObject(hRequestCompleteEvent, INFINITE);
- cout << "------------------- Read the response -------------------" << endl;
- char lpReadBuff[256];
- do
- {
- INTERNET_BUFFERS InetBuff;
- FillMemory(&InetBuff, sizeof(InetBuff), 0);
- InetBuff.dwStructSize = sizeof(InetBuff);
- InetBuff.lpvBuffer = lpReadBuff;
- InetBuff.dwBufferLength = sizeof(lpReadBuff) - 1;
- if (bVerbose)
- {
- cout << "Calling InternetReadFileEx" << endl;
- cout.flush();
- }
- if (!InternetReadFileEx(hRequest,
- &InetBuff,
- 0, 2))
- {
- if (GetLastError() == ERROR_IO_PENDING)
- {
- if (bVerbose)
- {
- cout << "Waiting for InternetReadFileEx to complete" << endl;
- cout.flush();
- }
- WaitForSingleObject(hRequestCompleteEvent, INFINITE);
- }
- else
- {
- cout << "InternetReadFileEx failed, error " << GetLastError();
- cout.flush();
- return;
- }
- }
- lpReadBuff[InetBuff.dwBufferLength] = 0;
- cout << lpReadBuff;
- cout.flush();
- if (InetBuff.dwBufferLength == 0)
- bAllDone = TRUE;
- } while (bAllDone == FALSE);
- cout << endl << endl << "------------------- Request Complete ----------------" << endl;
- }
- void __stdcall Callback(HINTERNET hInternet,
- DWORD dwContext,
- DWORD dwInternetStatus,
- LPVOID lpStatusInfo,
- DWORD dwStatusInfoLen)
- {
- if (bVerbose)
- {
- cout << "Callback dwInternetStatus: " << dwInternetStatus << " Context: " << dwContext << endl;
- cout.flush();
- }
- switch(dwContext)
- {
- case 1: // Connection handle
- if (dwInternetStatus == INTERNET_STATUS_HANDLE_CREATED)
- {
- INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
- hConnect = (HINTERNET)pRes->dwResult;
- if (bVerbose)
- {
- cout << "Connect handle created" << endl;
- cout.flush();
- }
- SetEvent(hConnectedEvent);
- }
- break;
- case 2: // Request handle
- switch(dwInternetStatus)
- {
- case INTERNET_STATUS_HANDLE_CREATED:
- {
- INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
- hRequest = (HINTERNET)pRes->dwResult;
- if (bVerbose)
- {
- cout << "Request handle created" << endl;
- cout.flush();
- }
- SetEvent(hRequestOpenedEvent);
- }
- break;
- case INTERNET_STATUS_REQUEST_SENT:
- {
- DWORD *lpBytesSent = (DWORD*)lpStatusInfo;
- if (bVerbose)
- {
- cout << "Bytes Sent: " << *lpBytesSent << endl;
- cout.flush();
- }
- }
- break;
- case INTERNET_STATUS_REQUEST_COMPLETE:
- {
- INTERNET_ASYNC_RESULT *pAsyncRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
- if (bVerbose)
- {
- cout << "Function call finished" << endl;
- cout << "dwResult: " << pAsyncRes->dwResult << endl;
- cout << "dwError: " << pAsyncRes->dwError << endl;
- cout.flush();
- }
- SetEvent(hRequestCompleteEvent);
- }
- break;
- case INTERNET_STATUS_RECEIVING_RESPONSE:
- if (bVerbose)
- {
- cout << "Receiving Response" << endl;
- cout.flush();
- }
- break;
- case INTERNET_STATUS_RESPONSE_RECEIVED:
- {
- DWORD *dwBytesReceived = (DWORD*)lpStatusInfo;
- if (*dwBytesReceived == 0)
- bAllDone = TRUE;
- if (bVerbose)
- {
- cout << "Received " << *dwBytesReceived << endl;
- cout.flush();
- }
- }
- }
- }
- }
相关推荐
Day470&471.Netty概述&Netty高性能架构设计 -netty
Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO
Delphi 使用WinInet 进行下载
WinInetDownLoad('http://下载地名','c:\本地文件名') 引用 unit xHttpGetThread; interface const MAXBLOCKSIZE = 1024; function WinInetDownLoad(Url:PChar; FileName:string):Boolean; implementation uses Windo
TwinCAT3新手必看:5分钟搞定EtherCAT从站PDO动态配置(附电流变量添加技巧)
本文为TwinCAT3新手提供了EtherCAT从站PDO动态配置的快速入门指南。文章详细解析了Process Data Object(PDO)在实时数据交换中的核心作用,并分步演示了在TwinCAT3工程中扫描从站、动态添加与映射PDO(包括接收PDO和发送PDO)的完整操作流程。重点分享了如何灵活添加并监控如电机实际电流等关键工艺变量的高级技巧,并针对不同品牌驱动器的兼容性问题提供了实用的调试心法和解决方案,帮助工程师快速上手并优化工业自动化系统。
WinInet API 的异步方式使用
作者邮箱:zhtrue@sina.com异步方式并不是什么高深莫测的事物,WinInet API 更是大家耳熟能详。如果你仔细看过 MSDN 和 internet 上关于 WinInet API 的文章,你会发现尽管在很多篇章中提到了异步方式的使用,但是大部分说明都只说可以使用,而没有说如何使用。尽管如此,还是有一些文章可以给我们很多的提示,我会在后面列出。由于网络数据传输经常会消耗一
树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片
DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...
200smart 模拟量转换库的建立
模拟量当前值 =(工程值 - 工程量下限)*(模拟量上限 - 模拟量下限)/ (工程量上限 - 工程量下限)+ 模拟量下限2. 建立变量表3. 程序。
WinInet HTTP的异步方式使用
绪论 如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推崇的。 当你决定使用该方式时,你却找不到如何使用异步的说明。网上也没有任何例子。研究了很长时间,也做了很多试验,我最终决定着手来填补一份(非官方)空缺的文档。 为什么异步方式是最好的?因为它能够正确的处理超时。而在IE5.5下WinInet缺少此功能。 如果你试图使用Termin
基于用户的协同过滤算法(userCF)
1.定义 userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。 基于用户的协同过滤算法主要包括两个步骤: 2.第一步:找到和目标用户兴趣相似的用户集合。 利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过...
Windows Mobile下WinInet的异步使用方法
codeproject上有一篇老美写的关于HTTP异步的文章:http://www.codeproject.com/KB/IP/asyncwininet.aspx。 我做HTTP异步的时候,也是参考了这篇文章,受益匪浅。今天特地翻译出来,与大家共飨。 WinInet HTTP的异步方式使用 绪论 如果你曾经深入MSDN研究过WinInet API,你会注意到可使用异步方式且该方式是被推...
毕业论文管理系统的设计与实现
毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;
嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估
ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环
Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法
摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。
使用InternetOpenUrl挂起的一个解决方案
在某个同事留下的网络操作代码中,如果用户试图从网络打开一个实际并不存在的URL, 走到InternetOpenUrl这步,应用程序就一命呜呼了。这个API并没有按照文档上说的那样返回一个NULL给文件HANDLE,而是完全停止响应。他尝试使用InternetSetOption来设置超时的时限,代码里这样写DWORD n = 10000;InternetSetOption(p->Internet
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
异步方式调用WinInet
转自:http://www.cppblog.com/huyutian/articles/122994.html 异步方式调用WinInet 关于WinInet的异步模式,微软给过很多例子,但我觉得下面这个是比较好理解的。 原文地址,代码贴出来,有些细节部分还要自己慢慢体会。 我在调试过程中,还参照了以下一些链接 关于GetLastError返回1201(ERROR_INTE
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
WinInet
About WinInet:https://docs.microsoft.com/en-us/windows/desktop/WinInet/about-wininet https://blog.youkuaiyun.com/zhenyusoso/article/details/7956672 WinInet, WinHttp, Winsock, ws2_32的区别和联系 在Windows平台进...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
1572



被折叠的 条评论
为什么被折叠?



