Windows 套接字:使用类 CAsyncSocket
本文介绍如何使用类 CAsyncSocket
。 此类在一个非常低的级别上封装 Windows 套接字 API。 CAsyncSocket
适用于那些对网络通信有详细的了解,但又想获得网络事件通知的回调便利的程序员。 基于这一假设,本文只提供基本说明。 如果你需要 Windows 套接字在 MFC 应用程序中轻松处理多个网络协议,但又不想牺牲灵活性,也许应该考虑使用 CAsyncSocket
。 你可能还觉得,与使用类 CSocket
的更通用替代模型相比,你可以自己更直接地对通信进行编程,从而提高效率。
CAsyncSocket
记录在 MFC 引用中。 Visual C++ 还提供了“Windows 套接字规范”(位于 Windows SDK 中)。 详细信息有待你发现。 Visual C++ 不提供 CAsyncSocket
的示例应用程序。
如果你对网络通信并不十分了解,并且需要一个简单的解决方案,可以将类 CSocket
与 CArchive
对象配合使用。 有关详细信息,请参阅 Windows 套接字:对存档使用套接字。
本文介绍:
创建和使用
CAsyncSocket
对象。
创建和使用 CAsyncSocket
使用 CAsyncSocket
构造
CAsyncSocket
对象,并使用此对象创建基础SOCKET
句柄。套接字的创建遵循两阶段构造的 MFC 模式。
例如:
CAsyncSocket sock; sock.Create(); // Use the default parameters
- 或者 -
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
上述第一个构造函数在堆栈上创建了
CAsyncSocket
对象。 第二个构造函数在堆上创建了CAsyncSocket
。 上述第一次Create
调用使用默认参数来创建流套接字。 第二次Create
调用创建了具有指定端口和地址的数据报套接字。 (可以将任一Create
版本用于任一构造方法。)Create
的参数如下:“端口”:一个短整数。
对于服务器套接字,必须指定端口。 对于客户端套接字,通常接受此参数的默认值,以便 Windows 套接字选择端口。
套接字类型:
SOCK_STREAM
(默认值)或SOCK_DGRAM
。套接字“地址”,例如
"ftp.microsoft.com"
或"128.56.22.8"
。这是网络上的 Internet 协议 (IP) 地址。 你可能将始终依赖此参数的默认值。
Windows 套接字:端口和套接字地址中介绍了术语“端口”和“套接字地址”。
如果套接字是客户端,则使用
CAsyncSocket::Connect
将套接字对象连接到服务器套接字。- 或者 -
如果套接字是服务器,则将套接字设置为开始侦听(使用
CAsyncSocket::Listen
)客户端的连接尝试。 在收到连接请求之后,通过CAsyncSocket::Accept
接受请求。接受连接后,可以执行验证密码等任务。
注意
Accept
成员函数会引用一个新的空CSocket
对象作为其参数。 必须先构造此对象,然后才能调用Accept
。 如果此套接字对象超出范围,则关闭连接。 请勿为此新的套接字对象调用Create
。 有关示例,请参阅 Windows 套接字:操作顺序一文。通过调用封装 Windows 套接字 API 函数的
CAsyncSocket
对象的成员函数,执行与其他套接字的通信。请参阅 MFC 参考中的 Windows 套接字规范和类
CAsyncSocket
。销毁
CAsyncSocket
对象。如果在堆栈上创建了套接字对象,那么当包含函数超出范围时,就会调用它的析构函数。 如果使用
new
运算符在堆上创建了套接字对象,你要负责使用delete
运算符销毁对象。在销毁对象之前,析构函数调用对象的
Close
成员函数。
有关代码中此序列的示例(实际上用于 CSocket
对象),请参阅 Windows 套接字:操作顺序。
对 CAsyncSocket
的职责
当你创建类 CAsyncSocket
的对象时,该对象封装 Windows SOCKET
句柄,并提供对该句柄的操作。 当你使用 CAsyncSocket
时,必须处理在直接使用 API 时可能遇到的所有问题。 例如:
“阻止”场景。
发送和接收计算机之间的字节顺序差异。
在 Unicode 和多字节字符集 (MBCS) 的字符串之间进行转换。
有关这些术语的定义和其他信息,请参阅 Windows 套接字:阻止、Windows 套接字:字节排序、Windows 套接字:转换字符串。
尽管存在这些问题,但如果应用程序需要能够获得的所有灵活性和控制,则类 CAsyncSocket
可能是正确的选择。 如果没有此类需求,请考虑改用类 CSocket
。 CSocket
对你隐藏了许多细节:它在阻止调用期间会抽取 Windows 消息,并提供对 CArchive
的访问权限,从而为你管理字节顺序差异和字符串转换。
有关详细信息,请参阅: