Windows 套接字:使用类 CAsyncSocket

本文介绍如何使用类 CAsyncSocket。 此类将 Windows 套接字 API 封装在非常低的水平。 CAsyncSocket 供了解网络通信但希望回调方便通知网络事件的程序员使用。 根据此假设,本文仅提供基本说明。 如果你希望 Windows 套接字能够轻松地在 MFC 应用程序中处理多个网络协议,但不想牺牲灵活性,则应考虑使用 CAsyncSocket 。 你可能还觉得,通过更直接地编程通信,你可以比使用更常规的类 CSocket替代模型更直接地编程来提高效率。

CAsyncSocket 记录在 MFC 参考中。 视觉C++还提供位于 Windows SDK 中的 Windows 套接字规范。 详细信息留给你。 视觉C++不提供示例 CAsyncSocket应用程序。

如果你对网络通信并想要一个简单的解决方案不了解,请将类 CSocket 与对象一 CArchive 起使用。 有关详细信息 ,请参阅 Windows 套接字:将套接字与存档配合使用

本文介绍:

创建和使用 CAsyncSocket

使用 CAsyncSocket

  1. 构造对象 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 使用以下参数:

    • “port”:短整数。

      对于服务器套接字,必须指定端口。 对于客户端套接字,通常接受此参数的默认值,以便 Windows 套接字选择端口。

    • 套接字类型: SOCK_STREAM (默认值)或 SOCK_DGRAM

    • 套接字“地址”,例如 "ftp.microsoft.com""128.56.22.8"

      这是网络上的 Internet 协议 (IP) 地址。 可能始终依赖于此参数的默认值。

    Windows 套接字中介绍了“端口”和“套接字地址”术语 :端口和套接字地址

  2. 如果套接字是客户端,请使用 将套接字对象连接到服务器套接字

    -或-

    如果套接字是服务器,请将套接字设置为开始侦听(使用 CAsyncSocket::Listen)从客户端进行连接尝试。 收到连接请求后,请接受该请求 CAsyncSocket::Accept

    接受连接后,可以执行验证密码等任务。

    注释

    Accept 成员函数会引用一个新的空 CSocket 对象作为其参数。 必须先构造此对象,然后才能调用 Accept。 如果此套接字对象超出范围,连接将关闭。 不要调用 Create 此新的套接字对象。 有关示例,请参阅 Windows 套接字:作序列一文。

  3. 通过调用 CAsyncSocket 封装 Windows 套接字 API 函数的对象的成员函数来与其他套接字进行通信。

    请参阅 MFC 参考中的 Windows 套接字规范和类CAsyncSocket

  4. CAsyncSocket销毁对象。

    如果在堆栈上创建了套接字对象,则在包含函数超出范围时调用其析构函数。 如果在堆上创建了套接字对象,则使用 new 运算符负责使用该 delete 运算符销毁对象。

    析构函数在销毁对象之前调用对象的 Close 成员函数。

有关代码中此序列的示例(实际上适用于 CSocket 对象),请参阅 Windows 套接字:作序列

你的职责 CAsyncSocket

创建类 CAsyncSocket的对象时,该对象封装 Windows SOCKET 句柄并提供该句柄上的作。 使用 CAsyncSocket时,必须处理直接使用 API 时可能遇到的所有问题。 例如:

  • “阻止”方案。

  • 发送和接收计算机之间的字节顺序差异。

  • 在 Unicode 和多字节字符集(MBCS)字符串之间进行转换。

有关这些术语的定义和其他信息,请参阅 Windows 套接字:阻止Windows 套接字:字节排序Windows 套接字:转换字符串

尽管存在这些问题,但如果应用程序需要获得的所有灵活性和控制,则类 CAsyncSocket 可能是正确的选择。 如果没有,请考虑改用类 CSocketCSocket 隐藏许多详细信息:它会在阻止调用期间泵送 Windows 消息,并为你提供访问权限 CArchive,从而为你管理字节顺序差异和字符串转换。

有关详细信息,请参见:

另请参阅

MFC 中的 Windows 套接字