如何结束异步WinInet的回调函数?

饿半肚 2012-02-07 06:10:58
之前的一个帖子——
“Win7里TerminateThread会造成崩溃?”
http://topic.csdn.net/u/20120116/17/2fb1c63e-8f37-4bf3-8fd7-b32343ceaf36.html

已经定位出原因了,就是因为发送http请求的线程被结束了以后,通过InternetSetStatusCallback设置的回调函数还会继续被调用,结果就引用到一些已经被销毁了的变量,引起崩溃。

我尝试在结束线程前先调用InternetSetStatusCallback(hInternet, NULL);取消其回调函数。但是无效。。求解,或求方案,谢谢。。(另外,我也试了在结束线程前首先把各种句柄InternetCloseHandle()掉,但也是没作用。。)
...全文
128 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
饿半肚 2012-02-08
  • 打赏
  • 举报
回复
果然哦!谢谢!
ArcRain 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kniferlv0 的回复:]

请问是哪个版本的SDK?HINTERNET为什么有继承派生之说?搞不懂啊,麻烦再点拨一下喽~~
[/Quote]

不是继承派生,而是相当于一次操作的上下文关联HINTERNET。
后续的HINTERNET是建立在之前的HINTERNET上,所以如果对之前的HINTERNET设置了一次Callback,那么后续建立在这个HINTERNET上的HINTERNET也会有Callback。
参考这个链接里的图:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383766%28v=vs.85%29.aspx
例如你在InternetOpen返回的HINTERNET上设置了一次Callback,那么在InternetConnect调用之后返回的HINTERNET上,这个Callback也是有效的,这样你在关闭HINTERNET时,就需要分别都把这两个HINTERNET的Callback置空。
饿半肚 2012-02-07
  • 打赏
  • 举报
回复
请问是哪个版本的SDK?HINTERNET为什么有继承派生之说?搞不懂啊,麻烦再点拨一下喽~~
ArcRain 2012-02-07
  • 打赏
  • 举报
回复
你可以参考SDK的例子Samples\web\Wininet\Async,注意看它的结束操作。
另外MSDN上也提到了,A callback function can be set on any handle, and is inherited by derived handles.
参考链接:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385120(v=vs.85).aspx
因此在结束操作时,你要尝试把派生的各HINTERNET上的回调都置空。
过去做网络方面的东东的时候,为了试验一些SOCKET API,编写了一个演示的DEMO,可能有朋友用得到,仅在此抛砖引玉。 这个测试工程中对Socket封装的类的文件: Soc.h Soc.cpp 网络传输封装类 SocMesWnd 异步网络传输时,接收网络消息的窗体 该DEMO演示了以下技术: 1、CTCPServe、CTCPClient Tcp异步传输,含TCP客户端与TCP服务端 2、CUDPSocket Udp异步传输 & Udp组播 3、CUDPSock5 Udp Sock5传输 4、CFtp Ftp传输 设计说明: 每个传输类都有以下两个方法 void SetSocketNotify( HWND hWndMsg, UINT unMsg ){m_hWndMsg = hWndMsg; m_nMsg = unMsg;}; void SetSocketNotify(SOCKET_NOTIFY pFuncMes){m_pFuncMes = pFuncMes;}; 这两个函数用来设置发生socket事件后的外部响应方式,一种是通过窗口消息进行响应,一种是通过回调函数进行响应。这两种方式都是阻塞的。 当发生网络事件后,两种方式都会收到 WPARAM wParam, LPARAM lParam 这两个参数,其中wParam是NET_MSG枚举,表示网络事件,lParam是附加数据,由SetExtData函数预先设置好。 void SetBufferLen( int nLen ); 该函数是设置当socket收到数据后,接收数据的缓冲区的大小的。当收到数据事件发生时,首先会将数据接收在缓冲区中,然后向发部发送消息或者调用回调函数,外部模块可以在响应函数中调用类的 void GetData( const BYTE ** ppucBuf, int &nLen ) 来获取接收到的数据。 对于 CTCPServe这个类,有些使用上的注意点:会在收到远程连接请求后自动连接客户端,当远程连接断开时,也会自动删除连接该远程socket的子socket。CTCPServe由于每次接受连接请求后,建立了新的子socket去连接远程客户,所以它有些方法需要输入子通道的标识来完成某些功能。该标识会在接受连接请求后通过响应消息或者函数发送给外部。 比如说: int GetRemoteIP( int nID, CString& strPeerAddress, int &nPeerPort ); 这个函数用来获取远程连接的客户端的IP和端口,参数中就需要指定是哪个远程客户。 UDP传输类在接收数据的时候会将远程发送数据的主机IP和地址传送给外部。 CUDPSock5在实际使用中发现与sock5服务器的连接不是很稳定,大概是我没能很好地解析sock5协议的关系。 这个DEMO在后期添加了CFtp这个类,处理FTP下载。之所以未使用WinInet,因为它有一个MS确认的BUG:超时设置无效。这个FTP类演示了FTP协议的解析过程,完成常用的FTP功能(除FTP上传外,容我有空再做,^_^)。它也是异步的。这个类支持PORT和PASSIVE两种模式的FTP,
第1章 计算机网络体系结构 1 1.1 网络术语及其拓扑结构 1 1.1.1 服务器、客户机和节点 1 1.1.2 本地资源和远程资源 1 1.1.3 网络操作系统 2 1.1.4 网络协议 2 1.1.5 网卡、桥和路由器 2 1.1.6 Intranet 3 1.1.7 拓扑结构 3 1.2 开放系统互连参考模型 3 1.2.1 物理层 4 1.2.2 数据链路层 4 1.2.3 网络层 5 1.2.4 传输层 5 1.2.5 会话层 5 1.2.6 表示层 6 1.2.7 应用层 6 1.2.8 OSI模型综述 6 1.3 TCP/IP参考模型 8 1.3.1 网络接口层 8 1.3.2 网际层 9 1.3.3 传输层 9 1.3.4 应用层 10 1.4 网络接口层及其相关协议 10 1.4.1 面向字符的链路层协议和面向比特的链路层协议 10 1.4.2 高级数据链路控制规程HDLC 11 1.4.3 X.25的链路层协议LAPB 13 1.4.4 点到点协议(PPP) 13 1.5 网际层及其相关协议 14 1.5.1 IP 14 1.5.2 消息控制协议 18 1.5.3 地址解析/反向地址解析协议 20 1.6 传输层及其相关协议 21 1.6.1 面向连接的TCP 21 1.6.2 无连接UDP 22 1.7 应用层及其相关协议 22 1.8 Intranet网络系统 23 1.8.1 Intranet网络组成 23 1.8.2 Intranet硬件结构 24 1.8.3 Intranet软件结构 25 1.9 小结 26 第2章 NetBIOS编程 27 2.1 Microsoft NetBIOS 27 2.1.1 LANA编号 28 2.1.2 NetBIOS名字 28 2.1.3 NetBIOS特性 31 2.2 NetBIOS基础 31 2.3 NetBIOS例程 33 2.3.1 异步回调模型 39 2.3.2 异步事件模型 43 2.3.3 NetBIOS会话客户端 47 2.4 其他NetBIOS命令 50 2.4.1 适配器状态 51 2.4.2 查找名字 52 2.4.3 对应传送协议同LANA编号 53 2.5 搜索指定网段内计算机 53 2.6 小结 58 第3章 重定向器、邮槽和管道 59 3.1 重定向器 59 3.1.1 命名规范 59 3.1.2 网络提供者 61 3.1.3 重定向器简介 61 3.1.4 服务器消息块 62 3.1.5 安全问题 62 3.1.6 网络安全 64 3.1.7 实例 64 3.2 邮槽 65 3.2.1 邮槽简介 66 3.2.2 基本客户端/服务器 68 3.2.3 其他邮槽API 74 3.3 管道 74 3.3.1 匿名管道 75 3.3.2 命名管道 77 3.3.3 客户端与服务器基础 83 3.3.4 其他API 97 3.3.5 命名管道通信 99 3.4 小结 103 第4章 网络协议TCP/IP 105 4.1 协议特征 105 4.1.1 面向消息 105 4.1.2 面向连接和无连接 106 4.1.3 可靠性和次序性 106 4.1.4 从容关闭 107 4.1.5 广播数据 107 4.1.6 多播数据 107 4.1.7 服务质量 107 4.1.8 部分消息 108 4.1.9 路由选择的考虑 108 4.1.10 其他特征 108 4.2 支持的协议 108 4.2.1 支持的Win32网络协议 109 4.2.2 Windows CE网络协议 110 4.3 网际协议(IP) 110 4.3.1 IP主要特征 110 4.3.2 IP数据报格式 111 4.3.3 IP服务定义和原语 116 4.3.4 IPv6 118 4.4 传输层协议TCP和UDP 123 4.4.1 传输层连接和端口地址 124 4.4.2 用户数据报协议(UDP) 127 4.4.3 传输控制协议TCP 129 4.4.4 定址 137 4.4.5 创建套接字 139 4.4.6 名字解析 139 4.4.7 端口号 140 4.5 TCP/IP安全性分析 141 4.5.1 TCP/IP整体构架安全分析 141 4.5.2 安全性和提高安全性方法 142 4.6 Winsock 2协议信息 145 4.7 具体平台的问题 147 4.8 综合实例 148 4.8.1 枚举系统支持网络协议 148 4.8.2 选择网络协议 156 4.8.3 TCP/IP信息统计 160 4.8.4 IP包监视 171 4.9 小结 178 第5章 局域网编程 179 5.1 局域网概述 179 5.1.1 局域网简史 179 5.1.2 局域网特点 180 5.1.3 局域网组成 180 5.2 网络接口卡与硬件编址 180 5.2.1 网卡基本结构 180 5.2.2 网卡参数 181 5.2.3 硬件编址与包过滤 182 5.2.4 硬件编址方式 183 5.2.5 广播与组播 184 5.2.6 帧格式 184 5.2.7 隐式帧网络 185 5.3 局域网拓扑结构 186 5.3.1 星型拓扑结构 186 5.3.2 环形拓扑结构 186 5.3.3 总线拓扑结构 187 5.3.4 树型结构 188 5.3.5 点对点连接 188 5.3.6 网状结构 188 5.4 局域网体系结构 189 5.4.1 IEEE 802局域网参考模型 189 5.4.2 IEEE 802局域网标准 191 5.4.3 以太网技术 192 5.4.4 令牌环网 196 5.5 综合实例 198 5.5.1 获取网卡信息1 198 5.5.2 获取网卡信息2 201 5.5.3 获取网卡信息3 203 5.6 小结 211 第6章 Winsock基础 212 6.1 套接字 212 6.2 Socket编程模型与Winsock规范 214 6.2.1 Socket编程模型演化 215 6.2.2 Winsock套接字主要特点 216 6.3 初始化Winsock 217 6.4 建立Windows套接字 218 6.5 错误检查和控制 220 6.6 面向连接的协议 221 6.6.1 服务器API函数 221 6.6.2 客户端API函数 225 6.6.3 数据传输 228 6.6.4 流协议 231 6.6.5 中断连接 233 6.6.6 综合分析 233 6.6.7 有连接通信示例 241 6.7 无连接协议 243 6.7.1 bind 243 6.7.2 创建服务器套接字 246 6.7.3 接收端 246 6.7.4 发送端 247 6.7.5 基于消息的协议 248 6.7.6 释放套接字资源 249 6.7.7 综合分析 249 6.7.8 无连接通信 255 6.8 其他API函数 258 6.9 小结 260 第7章 Winsock API高级编程 261 7.1 Winsock 输入/输出 261 7.1.1 套接字模式 261 7.1.2 I/O模型 264 7.2 套接字选项 302 7.2.1 SOL_SOCKET选项 303 7.2.2 IPPROTO_IP选项 308 7.2.3 IPPROTO_TCP选项 311 7.2.4 NSPROTO_IPX选项 311 7.3 套接字输出/输出控制 314 7.3.1 标准I/O控制 315 7.3.2 其他I/O控制 315 7.3.3 安全套接字层的I/O控制 320 7.4 原始套接字与底层传输协议 321 7.4.1 创建原始套接字 322 7.4.2 ICMP的实现 323 7.4.3 Internet组管理协议 336 7.4.4 IP_HDRINCL的使用 338 7.5 综合实例 345 7.5.1 枚举TCP和UDP连接状态 345 7.5.2 Ping实例 351 7.6 小结 357 第8章 MFC Winsock高级编程 359 8.1 Web基础知识 359 8.1.1 客户端 359 8.1.2 服务器 360 8.1.3 HTTP 362 8.2 HTTP服务器设计 363 8.2.1 同步操作 364 8.2.2 错误异常处理 364 8.2.3 发送/接收超时处理 364 8.3 创建自己的Winsock类 365 8.3.1 CSockAddress辅助类 365 8.3.2 CMyBlockSocketException类 367 8.3.3 CMyBlockSocket类 368 8.3.4 CMyHttpBlockSocket类 373 8.4 HTTP服务器示例 375 8.5 小结 386 第9章 深入UDP 387 9.1 局域网广播 387 9.1.1 广播通信的优缺点 387 9.1.2 广播通信实现 387 9.2 多播通信 389 9.2.1 多播的含义 389 9.2.2 IP多播 391 9.2.3 多播与Winsock 393 9.2.4 IP多播实例 407 9.3 多媒体通信与常规服务质量 412 9.3.1 背景知识 412 9.3.2 QOS和Winsock 416 9.3.3 QOS中止 421 9.3.4 QOS编程 429 9.3.5 语音全双工通信 434 9.4 小结 450 第10章 WinInet API开发 451 10.1 WinInetWinsock 451 10.2 使用WinInet API 452 10.2.1 句柄 452 10.2.2 错误处理 452 10.2.3 缓冲区参数 452 10.2.4 异步I/O 452 10.3 Internet函数 453 10.3.1 常用Internet函数 453 10.3.2 FTP客户端函数 459 10.3.3 HTTP客户端函数 461 10.3.4 Gopher客户端函数 465 10.4 WinInet API编程 465 10.4.1 HTTP客户编程 466 10.4.2 Cookies编程 468 10.4.3 FTP客户编程步骤 469 10.5 MFC WinInet类 472 10.5.1 WinInet类编程模型 473 10.5.2 其他常用函数 478 10.6 深入MFC WinInet类 482 10.6.1 CInternetSession类 483 10.6.2 连接类 483 10.6.3 文件类 484 10.6.4 CInternetException类 485 10.6.5 MFC WinInet类的关系 485 10.6.6 使用CInternetSession 486 10.6.7 FTP服务器处理 489 10.6.8 HTTP服务器处理 492 10.6.9 Gopher服务器处理 495 10.6.10 实现Internet查询 497 10.7 综合实例 505 10.7.1 多线程HTTP服务器 505 10.7.2 FTP客户端开发 529 10.8 小结 559 第11章 网络协议实现及应用 560 11.1 实现HTTP 560 11.1.1 HTTP 560 11.1.2 实现HTTP客户端 568 11.2 实现Telnet协议 572 11.2.1 Telnet协议 573 11.2.2 创建Telnet客户端 576 11.3 实现FTP 587 11.3.1 FTP 588 11.3.2 FTP应用程序 593 11.4 代理服务器 602 11.4.1 Socket 5协议 602 11.4.2 HTTP代理服务器 604 11.4.3 支持Socket5代理 615 11.5 信报API 622 11.5.1 MAPI结构 622 11.5.2 在MFC中支持MAPI 624 11.5.3 通用信报调用 626 11.5.4 简单MAPI 633 11.5.5 扩展MAPI和OLE信报库 633 11.6 小结 633 第12章 综合实例 634 12.1 管道高级通信 634 12.2 电子邮件检查程序 647 12.3 文件下载 661 12.4 网络版五子棋游戏 675 12.5 小结 687

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧