一、引言
Internet进行网际间通讯,在WWW浏览、FTP、Gopher这些常规服务,以及在网络电话、多媒体会议等这些对实时性要求严格的应用中成为研究的热点,而且已经是必需的了。Windows环境下进行通讯
程序设计的最基本方法是应用WindowsSockets实现进程间的通讯,为此微软提供了大量基于WindowsSockets的通讯API,如WinSockAPI、WinInetAPI和ISAPI,并一直致力于开发更快、更容易的通讯API,将其和MFC集成在一起以使通讯编程越来越容易。
MFC是VC编程环境最重要的组成部分,它为用户提供了一大批预先定义的类和成员函数,封装了大量的WindowsAPI。同时VC环境提供了与MFC对象和代码一起工作的专用工具:AppStudio源程序编辑器、AppWizard和ClassWizard。应用MFC,可以使Windows程序员用较少的时间和精力开发出复杂的通讯应用
程序。
本文根据笔者自己在开发实时网络音频工具FreeTalk过程中的一些经验,介绍Windows环境下的常用API和封装它们的MFC类,重点介绍使用MFC的CAsyncsocket和CSocket类编写网络通讯
程序的方法,这两个类封装了WinSockAPI,并使他们更容易使用和更适应于MFC编程环境。
二、Windows环境下的通讯API和相应的MFC类
1.WindowsSockets(WinSock)API
WindowsSockets定义了Windows的网络编程接口,它基于加利福尼亚大学伯克利分校的伯克利UnixSockets。WindowsSockets既包括BSD风格的例程,还加入了Windows的扩展部分,例如用于消息驱动的扩展函数。WindowsSockets可以运行在许多网络协议之上,包括TCP/IP、XNS、DECNet、IPX/SPX等。在Win32环境下,WindowsSockets提供线程安全。通过微软与标准组织的努力,为WinSock定义了应用
程序设计接口(WinSockAPI),可以非常方便地利用下层的网络协议(如TCP/IP)进行网络通讯。
通过提供两个类CAsyncSocket和CSocket,MFC支持使用WinSockAPI通讯程序设计。MFC把复杂的WinSockAPI封装到类里,这使得编写应用程序更容易。CAsyncSocket类逐个封装了WinSockAPI,为高级网络程序员提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS间转换字符的任务。为了给
程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSockAPI接口。Csocket类和CsocketFile类与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数[比如Receive()、Send()、ReceiveFrom()、SendTo()和Accept()]直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。2.Win32Internet(WinInet)API
微软公布了一些使Internet应用程序的设计比以前更快、更容易的API:WinInetAPI,它提供了中高层通信函数,这使访问主要的Internet协议变得相当容易。这些函数在
程序员和WinSock驱动之间提供了隔离层。有4类WinInetAPI函数:通用WinInet函数、WinInet文件传输协议(FTP)函数、WinInetGopher函数、WinInet超文本传输协议(HTTP)函数。
事实上,MFC把WinInetAPI和ActiveX技术封装进类,使Internet编程更加容易,这些类包括CInternetSession、CInternetConnection、CInternetFile、CHttpConnection、CHttpFile、CGopherFile、CFtpConnection、CGopherConnection、CFileF