VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1128|回复: 2

[转载] WinInet发送或接收函数超时的Bug & 解决办法

[复制链接]
51_avatar_middle
最佳答案
90 
online_admins 发表于 2020-2-15 20:44:59 | 显示全部楼层 |阅读模式
项目中有http的IO操作 使用了WinInet进行网络数据的发送和接收 

但是使用中发现 WinInet的读写函数(HttpSendRequest和InternetReadFile)经常会卡住 函数很久才会返回 有时甚至不返回



众所周知 使用socket进行网络IO操作时 可以按照如下方法设置网络超时的时长:
  1. bool SetTimeoutValue(SOCKET& socket, int timeout)
  2. {
  3.         // 设置发送函数超时的时长
  4.         if (setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR)
  5.                 return false;

  6.         // 设置接收函数超时的时长
  7.         if (setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR)
  8.                 return false;

  9.         return true;
  10. }
复制代码


WinInet是否也有类似的函数?经过搜索 发现WinInet的确也有类似的函数:InternetSetOption  + INTERNET_OPTION_CONNECT_TIMEOUT

  1. unsigned __stdcall SendRecvThread(void* pParam)
  2. {
  3.         // TODO :调用WinInet进行发送和接收,返回执行结果
  4. }

  5. void CHttpWininet::ReleaseWininet()
  6. {
  7.         // TODO :释放相关的HINTERNET对象         
  8. }

  9. bool CHttpWininet::RequestNetIO(DWORD dwTimeout)
  10. {                     
  11.         bool bResult = false;
  12.        
  13.         HANDLE hThreadHandle = (HANDLE)_beginthreadex(0, 0, SendRecvThread, this, 0, 0);
  14.         if (!hThreadHandle || (hThreadHandle == INVALID_HANDLE_VALUE))
  15.                 return bResult;

  16.         if (WaitForSingleObject(hThreadHandle, dwTimeout) == WAIT_TIMEOUT)
  17.         {
  18.                 ReleaseWininet(); // 多线程中的网络IO超时了 释放HINTERNET对象           
  19.                 WaitForSingleObject(hThreadHandle, INFINITE); // 释放HINTERNET后阻塞的IO函数就会返回。等待线程结束
  20.         }
  21.         else
  22.         {
  23.                 DWORD dwExitFlag = 0;
  24.                 ::GetExitCodeThread(hThreadHandle, &dwExitFlag);
  25.                 bResult = dwExitFlag ? true : false; // 多线程退出码标识了执行结果
  26.         }

  27.         CloseHandle(hThreadHandle);          
  28.         ReleaseWininet();

  29.         return bResult;
  30. }
复制代码




上一篇:新春防范肺炎!
下一篇:今日一贴!驱动环境下的线程创建!(笔记注释)
58_avatar_middle
最佳答案
58 
online_vip 发表于 2020-2-15 21:04:10 | 显示全部楼层
受益匪浅。
06_avatar_middle
最佳答案
0 
在线会员 发表于 2020-2-16 12:13:41 | 显示全部楼层
受益匪浅。mark
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-3 18:07

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表