按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
·278 ·
…………………………………………………………Page 290……………………………………………………………
第 10 章 动态链接库
{
// ESC F1~F12
case VK_ESCAPE:msg = 〃Press Key ……ESCAPE〃;break;
case VK_F1:msg = 〃Press Key ……F1〃;break;
case VK_F2:msg = 〃Press Key ……F2〃;break;
//此处省略了部分代码,详见本书的附带光盘目录下的 hook。cpp 文件;
if(KeyNameStr==〃Num = 〃)
msg = 〃Press Key ……VK_UP〃;
if(KeyNameStr==〃Num Del〃)
msg = 〃Press Key ……VK_UP〃;
AfxMessageBox(msg);
}
LRESULT RetVal = CallNextHookEx( hkb; nCode; wParam; lParam );
return RetVal;
}
程序运行结果如图 10…10 所示。
图 10…10 键盘钩子实例运行结果
从上面的代码可以看出,在加载键盘钩子的时候传入当前的线程 ID 号,从而创建线程
钩子。此钩子函数仅仅针对当前进程有效,即在其他进程处于活动状态时钩子并不生效,这
也是线程钩子和全局钩子的重要区别。
10。8 本章小结
本章介绍了动态链接库和钩子函数的概念和编程方法 。首先讲述了动态链接库的应用背
DllMain()入口函数、Dll 导出函数的概念和显示链接和隐式链接 DLL 的方法。通过 Visual
景、
C++ 6。0 可以编写标准的 Win32 动态链接库和基于 MFC 的常规和扩展动态链接库,本章给出
了利用 AppWizard 开发各种不同动态链接库的方法。在 DLL 中嵌入 Windows 资源有着广泛
的应用,在介绍如何调用 DLL 中的对话框资源的基础上,通过界面汉化的实例介绍了 DLL
资源在软件本地化中的应用。
钩子函数也是一个重要的 Windows 编程概念,本章介绍了不同的钩子函数类型和它们的
应用方法。在全局钩子的应用中离不开动态链接库的应用,全局鼠标钩子的实例演示了加载
一个全局的钩子函数的方法。同时,在实际应用中也需要仅仅针对特定线程的钩子函数,键
盘钩子实例演示了创建一个线程钩子函数定对不同的键盘消息进行处理的过程。
·279 ·
…………………………………………………………Page 291……………………………………………………………
第 11 章 网络编程
第 11 章 网络编程
在众多的计算机技术中,网络技术恐怕是和人们关系最紧密的计算机技术了。近年来,
网络以超乎想象的速度飞速发展,已经逐渐渗透到人们的生活中。在这种趋势下,编写网络
应用程序就成为一项常见的技能。本章将系统地介绍网络编程的有关知识,主要包括以下内
容:
o 网络编程的基础知识;
o 网络应用程序的基本结构及流程;
o WinSock 类详解;
o 通过一个具体的例子详细说明网络编程的实现;
o 利用 MSm 控件进行串口编程。
11。1 网络编程的基础知识
当今主要的网络模型有 OSI 参考模型、TCP/IP 参考模型、NetBEUI 参考模型和 IPX/SPX
参考模型,其中最常用的是 TCP/IP 参考模型,本章也以 TCP/IP 参考模型来讲解网络编程技
术。
11。1。1 Socket 简介
上世纪 80 年代初,加利福尼亚大学 Berkeley 分校在 UNIX 操作系统下实现了 TCP/IP 协
议,它们为 TCP/IP 网络通信开发了一个应用程序接口(API ),这个 API 称为 socket (套接
字)接口。socket 给程序员提供了一个高层接口,它的出现使得程序员在编写网络应用程序
时只需要调用函数,对网络的底层细节并不需要精通,因此十分方便。
Socket 在 UNIX 上的巨大成功使得人们迫切想要在 Windows 上也得到同样的便利。在
Windows3。0 之后,Socket 逐渐引入到 Windows 操作系统中。Windows Socket 不仅包含了
Berkeley Socket 的库函数,并且针对 Windows 的消息驱动机制的特性,包含了一组针对
Windows 的扩展的库函数。在 Intel、Microsoft 、Sun、SGI、Informix 、Novell 等公司的大力
支持下,Windows Socket (以下简称WinSock )从 1991 年的 1。0 版发展到了 1996 年的 2。2。0
版。如今,WinSock 已经成为 Windows 网络编程的标准。
11。1。2 Windows 套接字规范简介
Windows 套接字规范从 1991 年的 1。0 版发展到 1996 年的 2。2。0 版,其中几个标志性的版
本有 WinSock1。0 、WinSock1。1 和 WinSock2。0 。
…………………………………………………………Page 292……………………………………………………………
第 11 章 网络编程
1.WinSock1。0
WinSock1。0 是网络软件供应商和用户协会细致周到的工作结晶。WinSock1。0 规范的发布
是为了让网络软件供应商和应用程序开发者都能够开始建立各自符合 WinSock 标准的实现和
应用程序。
2 .WinSock1。1
WinSock1。1 除了继承 WinSock1。0 的准则和结构外,还作了一些必要的改动。这些改动
除了包含了一些更加清晰的说明和对 WinSock1。0 的小改动之外,还包含了如下重大的变更。
o 为了更加简单的得到主机名和地址,增加了 gethostname()函数。
o 在 DLL 中保留了小于 1000 的序数,而对大于 1000 的序数则没有限制,这使 WinSock
供应商可以在 DLL 中加入自己的界面,而不用担心所选择的序数会和 WinSock 将来
的版本冲突。
o 增加了 WSAStartup() 函数和 WSACleanup() 函数之间的关联,要求两个函数对应,这使
得应用程序开发者和第三方 DLL 在使用 WinSock 实现时不需要考虑其他函数对这套
API 的调用。
o 调整函数 in_addr() 的返回类型,in_addr 的结构改为无符号长整型,这个改动是为了适
应不同的 C 编译器对返回类型为 4 字节结构函数的不同处理方法。
o 把 WSASsyncSelect() 函数语义从“边缘触发”改为“电平触发”,这种方式大大简化了
应用程序对这个函数的调用。
o 改变了 ioctlsocket()函数中 FIONBIO 的语义。如果套接字还未完成 WSASsyncSelect()
函数的调用,则该函数返回失败。
o 为了符合 RFC1122 ,在套接字选项中增加了 TCP_NODELAY 。
不过 WinSock1。1 版本只支持 TCP/IP 协议。
3 .WinSock2。0
WinSock2。0 是 WinSock1。1 发展的一个比较重大的变革。它可以支持多种协议,并且为
了能与 WinSock1。1 更好地实现其兼容性,WinSock2。0 在 WinSock1。1 基础上作了向后兼容,
即源码和二进制代码。这就实现了 WinSock 应用程序和任何版本的 WinSock 实现之间的最大
的互操作性,同时也减轻了 WinSock 应用程序使用者、网络协议栈提供者和服务提供者的负
担。
11。2 网络应用程序
11。2。1 网络应用程序的基本模型
在 TCP/IP 网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式
(Client/Server model ),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服
·281 ·
…………………………………………………………Page 293……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
务。客户机/服务器模式的建立基于以下两点:
(1)建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造
就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。
(2 )网络间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不存在共
享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同
步,这就是基于客户机/服务器模式的 TCP/IP 。
客户机/服务器模式在操作过程中采取的是主动请求方式,具体操作步骤如下。
o 首先服务器方要先启动,并根据请求提供相应服务:
o 打开一通信通道并告知本地主机,它愿意在某一端口上接收客户请求。
o 等待客户请求到达该端口。
o 接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一
新进程来处理这个客户请求 。新进程处理此客户请求,并不需要对其他请求作出应答。
服务完成后,关闭此进程与客户的通信链路,并终止该进程。
o 返回第二步,等待另一客户请求。
o 关闭服务器。
客户方的主要操作步骤如下:
o 打开一通信通道,并连接到服务器所在主机的指定端口。
o 向服务器发服务请求报文,等待并接收应答;继续提出请求。
o 请求结束后关闭通信通道并终止。
在客户机/服务器编程模型下,又分为面向连接的编程模型和无连接的编程模型。
o 面向连接的编程模型:当服务器程序的套接字创建并初始化完毕时,它先进入休眠状
态,直到有客户机向该服务器程序提出连接请求。这时,服务器程序被“唤醒”并开
始响应客户机提出的连接请求