防止应用程序被网络操作失败卡死的算法

简介:

在某个同事留下的网络操作代码中,如果用户试图从网络打开一个实际并不存在的URL, 走到InternetOpenUrl这步,应用程序就一命呜呼了。这个API并没有按照文档上说的那样返回一个NULL给文件HANDLE,而是完全停止响应。他尝试使用InternetSetOption来设置超时的时限,代码里这样写

DWORD n = 10000;
InternetSetOption(p->Internet, INTERNET_OPTION_CONNECT_TIMEOUT, &n, sizeof(n));

但没有实际效果。从后文可以猜测,InternetOpenUrl再去调用了网络的IO处理,在IO处理中被卡死,罪过似乎并不在InternetOpenUrl和wininet.dll这层上.

于是他在前面某次工作记录里说已经解决了这个问题,然后又被测试组骂回来说没效果. 我搜到了开源代码里一个很好的算法, 自己测试了下,的确有效。让我们来看下它的算法,确实很精妙. 整个算法的核心是用异步方式来处理wininet.dll提供的那些函数



具体实现代码如下:

(1) 首先, 在InternetOpen时修改了参数
   它用的是  InternetOpen(T("MyApp"), p->AccessType, NULL,NULL, INTERNET_FLAG_ASYNC);   
   而会卡死的情况下用的是 InternetOpen(T("AmoiPlayer"),INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
   前面几个参数不是影响该性能的关键,关键点在最后一个参数上: INTERNET_FLAG_ASYNC. 在文档里对这个参数的解释是 Makes only asynchronous requests on handles descended from the handle returned from this function.  写得有些晦涩. 实际效果就是如果在InternetOpen中设置为INTERNET_FLAG_ASYNC, 那么在InternetOpenUrl时就会立刻返回,  如果为NULL就必须有具体的返回值才肯RETRUN.

(2) 注册一个CALLBACK函数  InternetSetStatusCallback(p->Internet, InternetCallback)
      因为我们OpenURL操作会立刻返回了,那么什么时候能得到有效或无效的HANDLE呢? 这就需要一个CALLBACK来做这件事情.  这里当然有必要看下这个CALLBACK函数里做了什么

static  void CALLBACK InternetCallback(HINTERNET hInternet,
                               DWORD dwContext,
                               DWORD dwInternetStatus,
                               LPVOID lpvStatusInformation,
                               DWORD dwStatusInformationLength)
{
     if (dwInternetStatus == INTERNET_STATUS_REQUEST_COMPLETE)
    {
        INTERNET_ASYNC_RESULT *Result = (INTERNET_ASYNC_RESULT*)lpvStatusInformation;
        http *p = (http*)dwContext;
        p->CompleteResult = Result->dwResult;
        SetEvent(p->Complete);
    }
}

当等到INTERNET_STATUS_REQUEST_COMPLETE通知的时候, 把RESULT获取下来放在p->CompleteResult里面,然后SetEvent. 也就是说系统CALLBACK线程和其他什么线程进行通信了

(3) 在InternetOpenUrl的时候代码如下:

Result = (DWORD)InternetOpenUrl(p->Internet, URL, s, (DWORD)-1, INTERNET_FLAG_NO_CACHE_WRITE|Secure, (DWORD)p);

p->Handle = (HANDLE)Pending(p, Result , 30);

if (Result || GetLastError() != ERROR_IO_PENDING)
{
  p->Handle = Result;
}
else

  p->Pending = 1;
   if ( WaitForSingleObject(p->Complete,300000) == WAIT_OBJECT_0 )
  {
    p->Pending =0;
    p->Handle  = p->CompleteResult;
  }
   else
  {
    p->Handle = NULL;
  }
}

 
代码中把流程图中的左边线程, 从调用API触发CALLBACK开始, 到底端取得HANDEL这块算法封装为一个函数, 可以被其他对wininet.dll接口函数的操作共用, 如InternetReadFile等.


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/06/21/431305.html,如需转载请自行联系原作者


相关文章
|
11天前
|
人工智能 运维 物联网
AI在蜂窝网络中的应用前景
AI在蜂窝网络中的应用前景
22 3
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
13天前
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
11天前
RS-485网络中的标准端接与交流电端接应用解析
RS-485,作为一种广泛应用的差分信号传输标准,因其传输距离远、抗干扰能力强、支持多点通讯等优点,在工业自动化、智能建筑、交通运输等领域得到了广泛应用。在构建RS-485网络时,端接技术扮演着至关重要的角色,它直接影响到网络的信号完整性、稳定性和通信质量。
|
14天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
14天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
43 5
|
14天前
|
运维 物联网 网络虚拟化
网络功能虚拟化(NFV):定义、原理及应用前景
网络功能虚拟化(NFV):定义、原理及应用前景
31 3
|
12天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
43 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
14天前
|
数据可视化 算法 安全
员工上网行为管理软件:S - PLUS 在网络统计分析中的应用
在数字化办公环境中,S-PLUS 员工上网行为管理软件通过精准的数据收集、深入的流量分析和直观的可视化呈现,有效帮助企业管理员工上网行为,保障网络安全和提高运营效率。
24 1
|
10天前
|
监控 网络协议 安全
员工网络监控软件:PowerShell 在网络监控自动化中的应用
在数字化办公环境中,企业对员工网络活动的监控需求日益增长。PowerShell 作为一种强大的脚本语言,能够有效实现员工网络监控自动化。本文介绍了如何使用 PowerShell 获取网络连接信息、监控特定网址的访问情况,并生成自动化报告,帮助企业高效管理员工网络活动,确保网络安全和合规性。
23 0
下一篇
无影云桌面