CASyncSocket 类和 CSocket 类编程
本文主要讲解以下内容
(1)CAsyncSocket 类编程模式。
(2)CSocket 类编程模式。
(3)CSocketFile 类和 CArchive 类简介。
通过学习,可以掌握 CAsyncSocket 类和 CSocket 类的编程模式,了解 CSocketFile 类和
CArchive 类。CAsyncSocket 类逐个封装了 Winsock 函数,以前介绍过的 Winsock 函数在 CAsyncSocket 类
的成员函数中都可以找到它们对应的函数。一个 CAsyncSocket 对象就代表着一个 Windows Socket,
使用这个类进行网络编程,就要求程序员对网络通信和 Socket 编程模式有相当的了解,因为程序员
要自己编写程序处理阻塞、字节顺序以及 Unicode 与 MBCS 之间的转换等问题。
为使程序员可以更方便地编写 Socket 程序,MFC 又给出了 CSocket 类。CSocket 类是 CAsyncSocket
类的派生类,它在继承了 CAsyncSocket 类的所有函数的同时提供了比 CAsyncSocket 类更高层的网络
编程接口。利用 CSocket 类和与之搭配的 CSocketFile 类以及 CArchive 类编写网络程序更加简单便利,
这主要是由于在 CSocket 类中提供了阻塞模式,因而可以利用 CArchive 进行同步操作。
提示:
在这里需要特别强调一下阻塞函数的概念,一个 Socket 可以处于“阻塞模式”或“非阻塞模式”,
当一个 Socket 处于“阻塞模式”时,它的阻塞函数(如 send 函数、recv 函数之类的函数)直到其操
作完成后才会返回给程序控制权,而 Socket 的阻塞在此之前不能作其他操作。如果 Socket 处于“非
阻塞模式”(即异步模式),调用函数将会立即返回给程序控制权。
对于阻塞函数引起的错误,调用 CAsyncSocket 类的 GetLastError 成员函数时,将返回错误
WSAEWOULDBLOCK。而对于 CSocket 类,由于它有自己的阻塞管理,则不会出现该类错误代码,
CSocket 类的许多成员函数都带有阻塞性质,但可以结合 CArchive 类处理。在 Win32 环境下,如果
要使用具有阻塞性质的 Socket,应该将其放在单独的工作者线程中,充分利用多线程编程不干预其他
线程的便利。多线程编程的方法,可以使程序员充分利用 CSocket 类的阻塞管理方式,而不影响到用
户界面线程。
要在 MFC 中进行 Socket 编程,需要在应用程序类的 Initlnstance 中调用 AfxSocketlnit 初始化套
接字。如果使用 AppWizard 创建应用程序的基本框架时,选中了“WindowsSockets”复选框,那么将
自动添加初始化代码。
1 CAsyncSocket 类编程模式
在用 MFC 进行 Winsock 编程时,使用 CAsyncSocket 类的优点为:可以轻松处理多个网络协议,
效率高,灵活性好;它的缺点则是需要程序员编写程序来处理诸如阻塞等情况,比较麻烦。
提示:
使用 CAsyncSocket 类和 CSocket 类编程,需要加载头文件 afxsock.h。
以下为 CAsyncSocket 类的编程模式。
1)创建一个 Socket
创建一个 Socket 分为两步,首先调用 CAsyncSocket 类的构造函数创建一个 CAsyncSocket 类的
对象;然后调用成员函数 Create 创建底层套接字。构造套接字时,对于服务器端的程序,需要用一