[http] WinInet发送或接收函数超时的bug & 解决办法
来源:互联网 发布:双十一网络销售情况 编辑:程序博客网 时间:2024/05/03 09:32
项目中有http的IO操作 使用了WinInet进行网络数据的发送和接收
但是使用中发现 WinInet的读写函数(HttpSendRequest和InternetReadFile)经常会卡住 函数很久才会返回 有时甚至不返回
众所周知 使用socket进行网络IO操作时 可以按照如下方法设置网络超时的时长:
bool SetTimeoutValue(SOCKET& socket, int timeout){// 设置发送函数超时的时长if (setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR)return false;// 设置接收函数超时的时长if (setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR)return false;return true;}
WinInet是否也有类似的函数?经过搜索 发现WinInet的确也有类似的函数:InternetSetOption + INTERNET_OPTION_CONNECT_TIMEOUT
但是根据微软官方回复 获知该API有bug 如果非要实现超时逻辑 需要采用多线程的方式实现 现将多线程方法的伪代码贴出来:
unsigned __stdcall SendRecvThread(void* pParam){// TODO :调用WinInet进行发送和接收,返回执行结果}void CHttpWininet::ReleaseWininet(){// TODO :释放相关的HINTERNET对象 }bool CHttpWininet::RequestNetIO(DWORD dwTimeout){ bool bResult = false;HANDLE hThreadHandle = (HANDLE)_beginthreadex(0, 0, SendRecvThread, this, 0, 0);if (!hThreadHandle || (hThreadHandle == INVALID_HANDLE_VALUE))return bResult;if (WaitForSingleObject(hThreadHandle, dwTimeout) == WAIT_TIMEOUT){ReleaseWininet(); // 多线程中的网络IO超时了 释放HINTERNET对象 WaitForSingleObject(hThreadHandle, INFINITE); // 释放HINTERNET后阻塞的IO函数就会返回。等待线程结束}else{DWORD dwExitFlag = 0;::GetExitCodeThread(hThreadHandle, &dwExitFlag);bResult = dwExitFlag ? true : false; // 多线程退出码标识了执行结果}CloseHandle(hThreadHandle); ReleaseWininet(); return bResult;}
1 0
- [http] WinInet发送或接收函数超时的bug & 解决办法
- WinSock中关于阻塞接收/发送超时的一个BUG
- WinSock中关于阻塞接收/发送超时的一个BUG
- Socket发送请求“超时”——接收数据方式引起的bug
- 设置TCP阻塞模式下的发送和接收函数超时时间
- CTP: 接收心跳超时Bug
- AngularJs中$http发送post或者get请求,SpringMVC后台接收不到参数值的解决办法
- wininet的使用(http)
- wininet的使用(http)
- CSOCKET的超时设置和UDP发送接收
- JAVA Http协议的发送接收
- Asp.net 发送大量邮件超时的解决办法
- Asp.net 发送大量邮件超时的解决办法
- CXF发送、接收消息超时设置
- Tcp设置发送和接收超时
- 网络中超时接收的函数之一 select
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- 武大校赛 26. Lost in WHU(矩阵快速幂)
- TLS协议分析 (四) handshake协议概览
- poj 2309
- 图片64位加密
- 前端中的那些注释
- [http] WinInet发送或接收函数超时的bug & 解决办法
- LeetCode 9. Palindrome Number
- sql server replace替换字段内容
- MyBatis参数传入集合之foreach动态sql
- (21):用函数对象表示策略
- servlet详解
- 1056. Mice and Rice (25)
- JSON解析类库之JSON-lib --- JSON-lib类库学习, 生成与解析json数据, json字符串与Java对象互转
- 七大排序