CAsyncSocket

表示 Windows 套接字 - 网络通信的终结点。

语法

class CAsyncSocket : public CObject

成员

公共构造函数

“属性” 说明
CAsyncSocket::CAsyncSocket 构造 CAsyncSocket 对象。

公共方法

“属性” 说明
CAsyncSocket::Accept 接受套接字上的连接。
CAsyncSocket::AsyncSelect 请求套接字的事件通知。
CAsyncSocket::Attach 将套接字句柄附加到 CAsyncSocket 对象。
CAsyncSocket::Bind 将本地地址与套接字关联。
CAsyncSocket::Close 关闭套接字。
CAsyncSocket::Connect 建立与对等套接字的连接。
CAsyncSocket::Create 创建套接字。
CAsyncSocket::CreateEx 创建具有高级选项的套接字。
CAsyncSocket::Detach 从 对象分离套接字 CAsyncSocket 句柄。
CAsyncSocket::FromHandle 在给定套接字句柄 CAsyncSocket 时,返回指向 对象的指针。
CAsyncSocket::GetLastError 获取最后一个失败操作的错误状态。
CAsyncSocket::GetPeerName 获取套接字连接到的对等套接字的地址。
CAsyncSocket::GetPeerNameEx 获取套接字连接到的对等套接字的地址, (IPv6 地址) 。
CAsyncSocket::GetSockName 获取套接字的本地名称。
CAsyncSocket::GetSockNameEx 获取套接字的本地名称, (IPv6 地址) 。
CAsyncSocket::GetSockOpt 检索套接字选项。
CAsyncSocket::IOCtl 控制套接字的模式。
CAsyncSocket::Listen 建立用于侦听传入连接请求的套接字。
CAsyncSocket::Receive 从套接字接收数据。
CAsyncSocket::ReceiveFrom 接收数据报并存储源地址。
CAsyncSocket::ReceiveFromEx 接收数据报,并存储 (处理) IPv6 地址的源地址。
CAsyncSocket::Send 将数据发送到连接的套接字。
CAsyncSocket::SendTo 向特定目标发送数据。
CAsyncSocket::SendToEx 将数据发送到特定目标 (处理) 的 IPv6 地址。
CAsyncSocket::SetSockOpt 设置套接字选项。
CAsyncSocket::ShutDown Send Receive 在套接字上禁用和/或调用。
CASyncSocket::Socket 分配套接字句柄。

受保护的方法

名称 说明
CAsyncSocket::OnAccept 通知侦听套接字它可以通过调用来接受挂起的连接请求 Accept
CAsyncSocket::OnClose 通知套接字连接到它的套接字已关闭。
CAsyncSocket::OnConnect 通知连接套接字连接尝试已完成(无论是成功还是错误)。
CAsyncSocket::OnOutOfBandData 通知接收套接字存在要在套接字上读取的带外数据,通常为紧急消息。
CAsyncSocket::OnReceive 通知侦听套接字有要通过调用检索的数据 Receive
CAsyncSocket::OnSend 通知套接字它可以通过调用发送数据 Send

公共运算符

名称 说明
CAsyncSocket:: operator = 将新值分配给 CAsyncSocket 对象。
CAsyncSocket:: operator 套接字 使用此运算符检索对象的 SOCKET 句柄 CAsyncSocket

公共数据成员

名称 说明
CAsyncSocket::m_hSocket 指示 SOCKET 附加到此对象的句柄 CAsyncSocket

注解

类封装 Windows 套接字函数 API,为想要将 Windows 套接字与 MFC 结合使用的程序员提供面向对象 CAsyncSocket 的抽象。

此类基于你了解网络通信的假设。 你负责处理 Unicode 和多字节字符集之间的阻塞、字节顺序差异以及 MBCS 字符串 () 转换。 如果需要一个更方便的接口来管理这些问题,请参阅类 CSocket

若要使用 对象,请调用其构造函数,然后调用 函数以创建类型为 (的基础套接字) ,但接受的 CAsyncSocket Create SOCKET 套接字除外。 对于服务器套接字,调用 Listen 成员函数;对于客户端套接字,调用 Connect 成员函数。 服务器套接字应在收到 Accept 连接请求时调用函数。 使用剩余的 CAsyncSocket 函数在套接字之间执行通信。 完成后,如果对象是在堆上创建的,则销毁该对象 CAsyncSocket ;析构函数会自动调用 Close 函数。 Windows SOCKET 套接字:背景 一文 介绍了数据类型

备注

在静态链接的 MFC 应用程序中的辅助线程中使用 MFC 套接字时,您必须在使用套接字的每个线程中调用 AfxSocketInit 来初始化套接字库。 默认情况下,仅在主线程中调用 AfxSocketInit

有关详细信息,请参阅Windows 套接字:使用类 CAsyncSocket 和相关文章。以及 Windows 套接字2 API。

继承层次结构

CObject

CAsyncSocket

要求

标头:afxsock.h

CAsyncSocket::Accept

调用此成员函数以接受套接字上的连接。

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

参数

rConnectedSocket
标识可用于连接的新套接字的引用。

lpSockAddr
一个指向 SOCKADDR 结构的指针,该结构接收连接套接字的地址(网络已知)。 参数的确切 lpSockAddr 格式由创建套接字时建立的地址系列确定。 如果 lpSockAddr 和/或 lpSockAddrLen 等于 NULL ,则不返回有关接受套接字的远程地址的信息。

lpSockAddrLen
指向地址长度(以字节 lpSockAddr 为单位)的指针。 lpSockAddrLen 是值结果参数:它最初应该包含所指向的空间量 lpSockAddr ; 在返回时,将包含返回的地址的实际长度 (以字节为) 单位)。

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数太小, (小于 SOCKADDR 结构) 的大小。

  • WSAEINPROGRESS 正在阻止 Windows 套接字调用。

  • WSAEINVAL``Listen不会在接受前调用。

  • WSAEMFILE 输入内容为 "已接受" 时,队列为空,并且没有可用的描述符。

  • WSAENOBUFS 无缓冲区空间可用。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP 引用的套接字不是支持面向连接的服务的类型。

  • WSAEWOULDBLOCK 套接字标记为非阻止,不存在要接受的连接。

注解

此例程提取挂起连接的队列中的第一个连接,创建具有与此套接字相同的属性的新套接字,并将其附加到 rConnectedSocket 。 如果队列中没有挂起的连接,则 Accept 返回零并 GetLastError 返回错误。 不能使用接受的套接字 (rConnectedSocket) 来接受更多连接。 原始套接字保持打开和侦听。

参数 lpSockAddr 是一个结果参数,该参数使用连接套接字的地址填充,与通信层已知。 Accept 用于基于连接的套接字类型(如) SOCK_STREAM

CAsyncSocket::AsyncSelect

调用此成员函数以请求套接字的事件通知。

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

参数

lEvent
一个位掩码,指定应用程序感兴趣的网络事件的组合。

  • FD_READ 想要接收有关阅读准备情况的通知。

  • FD_WRITE 想要在数据可供读取时收到通知。

  • FD_OOB 想要接收带外数据到达的通知。

  • FD_ACCEPT 想要接收传入连接的通知。

  • FD_CONNECT 想要接收连接结果的通知。

  • FD_CLOSE 希望当对等机关闭套接字时收到通知。

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEINVAL 指示其中一个指定的参数无效。

  • WSAEINPROGRESS 正在执行阻止 Windows 套接字操作。

注解

此函数用于指定将为套接字调用的 MFC 回调通知函数。 AsyncSelect 会自动将此套接字设置为非阻止模式。 有关详细信息,请参阅 Windows 套接字:套接字通知一文

CAsyncSocket::Attach

调用此成员函数以 hSocket 将句柄附加到 CAsyncSocket 对象。

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

参数

hSocket
包含套接字的句柄。

lEvent
一个位掩码,指定应用程序感兴趣的网络事件的组合。

  • FD_READ 想要接收有关阅读准备情况的通知。

  • FD_WRITE 希望在数据可供读取时接收通知。

  • FD_OOB 希望接收带外数据到达的通知。

  • FD_ACCEPT 希望接收传入连接的通知。

  • FD_CONNECT 希望接收连接结果的通知。

  • FD_CLOSE 希望在对等方关闭套接字时接收通知。

返回值

如果函数运行成功,则为非零。

注解

SOCKET 句柄存储在对象的 m_hSocket 数据成员中。

CAsyncSocket::Bind

调用此成员函数以将本地地址与套接字关联。

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

参数

nSocketPort
标识套接字应用程序的端口。

lpszSocketAddress
网络地址,一种点号,如 "128.56.22.8"。 NULL如果为此参数传递字符串,则指示该 CAsyncSocket 实例应侦听所有网络接口上的客户端活动。

lpSockAddr
指向 SOCKADDR 结构的指针,该结构包含要分配给此套接字的地址。

nSockAddrLen
地址的长度( lpSockAddr 以字节为单位)。

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 下面的列表介绍了可能返回的一些错误。 有关完整列表,请参阅 Windows 套接字错误代码

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEADDRINUSE 指定的地址已被使用。 (参阅 SO_REUSEADDR 下的套接字选项 SetSockOpt 。 )

  • WSAEFAULTnSockAddrLen 参数太小, (小于 SOCKADDR 结构) 的大小。

  • WSAEINPROGRESS 正在阻止 Windows 套接字调用。

  • WSAEAFNOSUPPORT 此端口不支持指定的地址系列。

  • WSAEINVAL 套接字已绑定到地址。

  • WSAENOBUFS 可用缓冲区不足,连接过多。

  • WSAENOTSOCK 描述符不是套接字。

注解

在后续调用 或 之前,此例程用于未连接的数据报或流 Connect Listen 套接字。 在可接受连接请求之前,侦听服务器套接字必须选择端口号,然后通过调用 使其为 Windows 套接字所了解 BindBind 通过向未命名 (套接字分配本地) ,建立与套接字的主机地址/端口号的本地关联。

CAsyncSocket::CAsyncSocket

构造空白套接字对象。

CAsyncSocket();

注解

构造 对象后,必须调用 Create 其成员函数来创建 SOCKET 数据结构并绑定其地址。 (在 Windows 套接字通信的服务器端,当侦听套接字创建一个套接字以用于调用时,不会调用该 Accept Create socket.)

CAsyncSocket::Close

关闭套接字。

virtual void Close();

注解

此函数释放套接字描述符,以便对它的进一步引用将失败并出现错误 WSAENOTSOCK 。 如果这是对基础套接字的最后一次引用,则放弃关联的命名信息和排队数据。 套接字对象的析构函数会 Close 调用 。

对于 CAsyncSocket ,但不是 CSocket ,的语义 Close 受套接字选项 和 SO_LINGER 的影响 SO_DONTLINGER 。 有关详细信息,请参阅成员函数 GetSockOpt

CAsyncSocket::Connect

调用此成员函数以建立到未连接的流或数据报套接字的连接。

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

参数

lpszHostAddress
此对象连接到的套接字的网络地址:计算机名称(如"ftp.microsoft.com",或点线数字,如"128.56.22.8"。

nHostPort
标识套接字应用程序的端口。

lpSockAddr
指向 SOCKADDR 结构的指针,该结构包含连接的套接字的地址。

nSockAddrLen
地址的长度( lpSockAddr 以字节为单位)。

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 如果这指示的错误代码 WSAEWOULDBLOCK ,并且你的应用程序正在使用可重写的回调, OnConnect 则当连接操作完成时,你的应用程序将收到一条消息。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEADDRINUSE 指定的地址已被使用。

  • WSAEINPROGRESS 正在阻止 Windows 套接字调用。

  • WSAEADDRNOTAVAIL 指定的地址在本地计算机上不可用。

  • WSAEAFNOSUPPORT 指定系列中的地址不能用于此套接字。

  • WSAECONNREFUSED 尝试连接被拒绝。

  • WSAEDESTADDRREQ 需要目标地址。

  • WSAEFAULTnSockAddrLen 参数不正确。

  • WSAEINVAL 无效的主机地址。

  • WSAEISCONN 套接字已连接。

  • WSAEMFILE 没有更多的文件描述符可用。

  • WSAENETUNREACH 此时无法从此主机访问网络。

  • WSAENOBUFS 无缓冲区空间可用。 无法连接套接字。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAETIMEDOUT 在未建立连接的情况下尝试连接时已发生时间过长。

  • WSAEWOULDBLOCK 套接字标记为非阻止,并且无法立即完成连接。

注解

如果套接字未绑定,则系统将唯一值分配给本地关联,并将套接字标记为绑定。 请注意,如果名称结构的地址字段全部为零, Connect 则 将返回零。 若要获取扩展错误信息,请调用 GetLastError 成员函数。

对于流套接字 (类型 SOCK_STREAM) ,将启动到外主机的活动连接。 套接字调用成功完成后,套接字即可发送/接收数据。

对于数据报套接字 (类型) ,将设置一个默认目标,该目标 SOCK_DGRAM 将用于后续和 Send Receive 调用。

CAsyncSocket::Create

构造 Create 套接字对象后调用成员函数,以创建并附加 Windows 套接字。

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

参数

nSocketPort
与套接字一起使用的已知端口;如果希望 Windows 套接字选择端口,则为 0。

nSocketType
SOCK_STREAMSOCK_DGRAM

lEvent
一个位掩码,指定应用程序感兴趣的网络事件的组合。

  • FD_READ 想要接收有关阅读准备情况的通知。

  • FD_WRITE 想要接收写入准备通知。

  • FD_OOB 想要接收带外数据到达的通知。

  • FD_ACCEPT 想要接收传入连接的通知。

  • FD_CONNECT 想要接收已完成连接的通知。

  • FD_CLOSE 想要接收套接字关闭通知。

lpszSockAddress
指向字符串的指针,该字符串包含连接的套接字的网络地址,即点线数字,例如"128.56.22.8"。 传递 NULL 此参数的字符串指示 CAsyncSocket 实例应侦听所有网络接口上的客户端活动。

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEAFNOSUPPORT 不支持指定的地址族。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEMFILE 没有更多的文件描述符可用。

  • WSAENOBUFS 无缓冲区空间可用。 无法创建套接字。

  • WSAEPROTONOSUPPORT 不支持指定的端口。

  • WSAEPROTOTYPE 为此套接字指定的端口类型错误。

  • WSAESOCKTNOSUPPORT 此地址系列不支持指定的套接字类型。

注解

Create 调用, Socket 如果成功,它将调用 Bind 以将套接字绑定到指定的地址。 支持以下套接字类型:

  • SOCK_STREAM 提供经过序列化的、可靠且基于连接的字节流。 为 Internet 地址系列使用传输控制协议 (TCP) 。

  • SOCK_DGRAM 支持数据报,该数据报为固定 (的无连接和不可靠数据包,通常为小) 最大长度。 为 Internet 地址系列使用用户数据报协议 (UDP) 。

    备注

    Accept成员函数使用新的空 CSocket 对象作为其参数。 在调用之前,必须构造此对象 Accept 。 请记住,如果此套接字对象超出范围,连接将关闭。 不要为此 Create 新的套接字对象调用 。

重要

Create 不是 线程 安全的。 如果在多线程环境中调用它,而该环境可能由不同的线程同时调用,请确保使用互斥锁或其他同步锁保护每个调用。

有关流套接字和数据报套接字的信息,请参阅文章Windows 套接字:背景和Windows 套接字:端口和套接字地址以及 Windows 套接字2 API。

CAsyncSocket::CreateEx

构造 CreateEx 套接字对象后调用成员函数,以创建并附加 Windows 套接字。

需要提供高级选项(如套接字类型)时,请使用此函数。

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

参数

pAI
指向 用于 ADDRINFOT 保存套接字信息(如系列和套接字类型)的 的指针。

lEvent
一个位掩码,指定应用程序感兴趣的网络事件的组合。

  • FD_READ 想要接收有关阅读准备情况的通知。

  • FD_WRITE 想要接收写入准备通知。

  • FD_OOB 想要接收带外数据到达的通知。

  • FD_ACCEPT 想要接收传入连接的通知。

  • FD_CONNECT 想要接收已完成连接的通知。

  • FD_CLOSE 想要接收套接字关闭通知。

返回值

请参阅 的返回值 Create()

注解

请参阅 的备注 Create()

CAsyncSocket::Detach

调用此成员函数以从 对象中分离数据 SOCKET m_hSocket 成员中的 CAsyncSocket 句柄,并 m_hSocket 设置为 NULL

SOCKET Detach();

CAsyncSocket::FromHandle

返回指向 对象的 CAsyncSocket 指针。

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

参数

hSocket
包含套接字的句柄。

返回值

指向对象的指针 CAsyncSocket ; NULL 如果没有 CAsyncSocket 附加到的对象,则为 hSocket

注解

如果给定了 SOCKET 句柄,则如果 CAsyncSocket 对象未附加到句柄,成员函数将返回 NULL

CAsyncSocket::GetLastError

调用此成员函数以获取上次失败的操作的错误状态。

static int PASCAL GetLastError();

返回值

返回值指示此线程执行的最后一个 Windows 套接字 API 例程的错误代码。

注解

当特定成员函数指示发生了错误时, GetLastError 应调用来检索相应的错误代码。 有关适用的错误代码的列表,请参阅单个成员函数说明。

有关错误代码的详细信息,请参阅 Windows 套接字 2 API

CAsyncSocket::GetPeerName

调用此成员函数以获取此套接字连接到的对等套接字的地址。

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

参数

rPeerAddress
CString 接收点分数字 IP 地址的对象的引用。

rPeerPort
对存储端口的的引用 UINT

lpSockAddr
指向 SOCKADDR 结构的指针,该结构接收对等套接字的名称。

lpSockAddrLen
指向地址长度的指针(以字节为 lpSockAddr 单位)。 返回时, lpSockAddrLen 参数包含返回的实际大小( lpSockAddr 以字节为单位)。

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数不够大。

  • WSAEINPROGRESS 正在阻止 Windows 套接字调用。

  • WSAENOTCONN 套接字未连接。

  • WSAENOTSOCK 描述符不是套接字。

注解

若要处理 IPv6 地址,请使用 CAsyncSocket::GetPeerNameEx

CAsyncSocket::GetPeerNameEx

调用此成员函数,获取此套接字连接到的对等套接字的地址, (IPv6 地址) 。

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

参数

rPeerAddress
对接收 CString 虚线 IP 地址的对象的引用。

rPeerPort
对存储 UINT 端口的 的引用。

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEFAULTlpSockAddrLen 参数不够大。

  • WSAEINPROGRESS 正在阻止 Windows 套接字调用。

  • WSAENOTCONN 套接字未连接。

  • WSAENOTSOCK 描述符不是套接字。

注解

此函数与 相同 CAsyncSocket::GetPeerName ,只不过它处理 IPv6 地址以及旧协议。

CAsyncSocket::GetSockName

调用此成员函数获取套接字的本地名称。

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

参数

rSocketAddress
对接收 CString 虚线 IP 地址的对象的引用。

rSocketPort
对存储 UINT 端口的 的引用。

lpSockAddr
指向接收 SOCKADDR 套接字地址的结构的指针。

lpSockAddrLen
指向地址长度(以字节 lpSockAddr 为单位)的指针。

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数不够大。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEINVAL 尚未使用将套接字绑定到地址 Bind

注解

如果未执行此操作,则此调用会特别有用 Connect Bind ; 此调用提供的唯一方法是确定系统已设置的本地关联。

若要处理 IPv6 地址,请使用 CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

调用此成员函数以获取套接字的本地名称 (处理) 的 IPv6 地址。

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

参数

rSocketAddress
CString 接收点分数字 IP 地址的对象的引用。

rSocketPort
对存储端口的的引用 UINT

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数不够大。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEINVAL 尚未使用将套接字绑定到地址 Bind

注解

此调用与 相同 CAsyncSocket::GetSockName ,只不过它处理 IPv6 地址以及较旧的协议。

在未执行第一个调用的情况下进行调用时,此调用特别有用;此调用提供了唯一可用于确定由系统设置的本地 Connect Bind 关联的方式。

CAsyncSocket::GetSockOpt

调用此成员函数以检索套接字选项。

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

参数

nOptionName
要检索其值的套接字选项。

lpOptionValue
指向要返回所请求选项的值的缓冲区的指针。 与所选选项关联的值在缓冲区 中返回 lpOptionValue 。 指向的整数最初应包含此缓冲区的大小(以字节为单位);返回时,它将设置为返回 lpOptionLen 的值的大小。 对于 ,这是结构的大小;对于所有其他选项,它将是 BOOL 或 的大小, SO_LINGER LINGER 具体取决于 int 选项。 请参阅"备注"部分中的选项列表及其大小。

lpOptionLen
指向缓冲区大小的指针 lpOptionValue (以字节为单位)。

nLevel
定义选项的级别;唯一支持的级别是 SOL_SOCKETIPPROTO_TCP

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 如果从未使用 设置选项 SetSockOptGetSockOpt 则返回该选项的默认值。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEFAULTlpOptionLen 参数无效。

  • WSAEINPROGRESS 正在执行阻止 Windows 套接字操作。

  • WSAENOPROTOOPT 选项未知或不受支持。 具体而言, 类型的套接字不支持 ,而 类型的套接字不支持 、 和 SO_BROADCAST SOCK_STREAM SO_ACCEPTCONN SO_DONTLINGER SO_KEEPALIVE SO_LINGER SO_OOBINLINE SOCK_DGRAM

  • WSAENOTSOCK 描述符不是套接字。

注解

GetSockOpt 检索与任意类型的任何类型的套接字关联的套接字选项的当前值,并将结果存储在中 lpOptionValue 。 选项会影响套接字操作,例如路由数据包、带外数据传输等。

支持以下选项 GetSockOpt 。 类型标识由寻址的数据的类型 lpOptionValueTCP_NODELAY选项使用 level IPPROTO_TCP ; 所有其他选项都使用 level SOL_SOCKET

类型 含义
SO_ACCEPTCONN BOOL 套接字正在侦听。
SO_BROADCAST BOOL 套接字配置为传输广播消息。
SO_DEBUG BOOL 启用调试。
SO_DONTLINGER BOOL 如果为 true,则 SO_LINGER 禁用该选项。
SO_DONTROUTE BOOL 已禁用路由。
SO_ERROR int 检索错误状态并清除。
SO_KEEPALIVE BOOL 正在发送 keep-alive。
SO_LINGER struct LINGER 返回当前逗留选项。
SO_OOBINLINE BOOL 正在正常数据流中接收带外数据。
SO_RCVBUF int 接收的缓冲区大小。
SO_REUSEADDR BOOL 可以将套接字绑定到已在使用中的地址。
SO_SNDBUF int 发送的缓冲区大小。
SO_TYPE int 套接字的类型 (例如, SOCK_STREAM) 。
TCP_NODELAY BOOL 为发送合并禁用 Nagle 算法。

不支持的 Berkeley 软件分发 (BSD) 选项 GetSockOpt

类型 含义
SO_RCVLOWAT int 接收低水位线。
SO_RCVTIMEO int 接收超时。
SO_SNDLOWAT int 发送低水位线。
SO_SNDTIMEO int 发送超时。
IP_OPTIONS 获取 IP 标头中的选项。
TCP_MAXSEG int 获取 TCP 最大段大小。

使用 GetSockOpt 不受支持的选项调用 将导致从 WSAENOPROTOOPT 返回错误代码 GetLastError

CAsyncSocket::IOCtl

调用此成员函数以控制套接字的模式。

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

参数

lCommand
对套接字执行的命令。

lpArgument
指向 的参数的指针 lCommand

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEINVALlCommand 不是有效的命令,或者 不是 可接受的参数,或者该命令不适用于提供的 lpArgument lCommand 套接字类型。

  • WSAEINPROGRESS 正在执行阻止 Windows 套接字操作。

  • WSAENOTSOCK 描述符不是套接字。

注解

此例程可用于任何状态的任何套接字。 它用于获取或检索与套接字关联的操作参数,与协议和通信子系统无关。 支持以下命令:

  • FIONBIO 在套接字上启用或禁用非阻止模式。 lpArgument 参数指向 DWORD ,如果要启用非阻止模式,则为非零值; 如果要禁用,则为零。 如果已 AsyncSelect 在套接字上发出,则尝试使用将 IOCtl 套接字设置回阻止模式将失败,并出现 WSAEINVAL 。 若要将套接字设置回阻止模式并防止 WSAEINVAL 错误,应用程序必须首先 AsyncSelect 通过将 AsyncSelect 参数设置 lEvent 为等于0来禁用,然后调用 IOCtl

  • FIONREAD 确定通过此套接字的一次调用可以读取的最大字节数 ReceivelpArgument 参数指向 DWORD IOCtl 存储结果的。 如果此套接字的类型为 SOCK_STREAM ,则 FIONREAD 返回可在单个中读取的数据总量 Receive ; 这通常与套接字上排队的数据总量相同。 如果此套接字的类型为 SOCK_DGRAM ,则 FIONREAD 返回在套接字上排队的第一个数据报的大小。

  • SIOCATMARK 确定是否已读取所有带外数据。 这仅适用于已 SOCK_STREAM 配置为可在任何带外数据 () 的行内接收的类型套接字 SO_OOBINLINE 。 如果没有带外数据正在等待读取,则操作将返回非零值。 否则,它将返回0,并且 ReceiveReceiveFrom 套接字上执行的下一个或执行的操作将检索部分或全部在 "标记" 之前的数据; 应用程序应使用 SIOCATMARK 操作来确定是否保留任何数据。 如果 "紧急" 之前有任何常规数据 (带外) 数据,则会按顺序接收该数据。 (请注意, ReceiveReceiveFrom 将永远不会在同一调用中混合带外和普通数据。 ) lpArgument 参数指向 DWORD IOCtl 存储结果的。

此函数是 ioctl() Berkeley 套接字中使用的的子集。 特别是,不存在与相同的命令 FIOASYNC ,而 SIOCATMARK 是唯一受支持的套接字级别命令。

CAsyncSocket::Listen

调用此成员函数以侦听传入连接请求。

BOOL Listen(int nConnectionBacklog = 5);

参数

nConnectionBacklog
挂起的连接队列可以增长到的最大长度。 有效范围为 1 到 5。

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEADDRINUSE 已尝试侦听使用中的地址。

  • WSAEINPROGRESS 正在执行阻止 Windows 套接字操作。

  • WSAEINVAL 套接字尚未绑定或 Bind 已连接。

  • WSAEISCONN 套接字已连接。

  • WSAEMFILE 不再提供文件描述符。

  • WSAENOBUFS 没有可用的缓冲区空间。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP 引用的套接字不是支持该操作 Listen 的类型。

注解

若要接受连接,首先使用 创建套接字,使用 指定传入连接的积压工作 ,然后使用 Create Listen 接受连接 AcceptListen 仅适用于支持连接的套接字,即 类型的套接字 SOCK_STREAM 。 此套接字进入"被动"模式,在此模式下,传入连接得到确认,并排队等待进程接受。

此函数通常由服务器 (或任何希望接受连接) (一次可能具有多个连接请求)的应用程序使用:如果连接请求到达时队列已满,则客户端将收到一个错误,指示为 WSAECONNREFUSED

Listen 当没有可用的端口或描述符时, (继续) 。 它将接受连接,直到队列被清空。 如果端口变为可用,稍后对或的 Listen 调用 Accept 会将队列重新填充到当前或最新的 "积压工作(backlog)",并继续侦听传入连接。

CAsyncSocket::m_hSocket

包含 SOCKET 此对象封装的套接字的句柄 CAsyncSocket

SOCKET m_hSocket;

CAsyncSocket::OnAccept

由框架调用,以通知侦听套接字它可以通过调用成员函数接受挂起的连接请求 Accept

virtual void OnAccept(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnAccept 成员函数:

  • 0 已成功执行该函数。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

注解

有关详细信息,请参阅 Windows 套接字:套接字通知

CAsyncSocket::OnClose

由框架调用以通知此套接字,连接的套接字已由其进程关闭。

virtual void OnClose(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnClose 成员函数:

  • 0 已成功执行该函数。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAECONNRESET 远程端已重置连接。

  • WSAECONNABORTED 由于超时或其他故障,连接已中止。

注解

有关详细信息,请参阅 Windows 套接字:套接字通知

CAsyncSocket::OnConnect

由框架调用,用于通知此连接套接字其连接尝试已完成(无论是成功还是错误)。

virtual void OnConnect(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnConnect 成员函数:

  • 0 已成功执行该函数。

  • WSAEADDRINUSE 指定的地址已在使用中。

  • WSAEADDRNOTAVAIL 指定的地址无法从本地计算机获得。

  • WSAEAFNOSUPPORT 指定系列中的地址不能用于此套接字。

  • WSAECONNREFUSED 强制拒绝连接尝试。

  • WSAEDESTADDRREQ 目标地址是必需的。

  • WSAEFAULTlpSockAddrLen 参数不正确。

  • WSAEINVAL 套接字已绑定到地址。

  • WSAEISCONN 套接字已连接。

  • WSAEMFILE 不再提供文件描述符。

  • WSAENETUNREACH 此时无法从此主机访问网络。

  • WSAENOBUFS 没有可用的缓冲区空间。 套接字无法连接。

  • WSAENOTCONN 套接字未连接。

  • WSAENOTSOCK 描述符是文件,而不是套接字。

  • WSAETIMEDOUT 连接尝试在未建立连接的情况下已失败。

注解

备注

CSocketOnConnect ,永远不会调用通知函数。 对于连接,只需调用 ,该调用将在连接完成时返回 (Connect 成功或错误) 。 如何处理连接通知是 MFC 实现详细信息。

有关详细信息,请参阅 Windows 套接字:套接字通知

示例

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

由框架调用,以通知接收套接字发送套接字具有要发送的带外数据。

virtual void OnOutOfBandData(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnOutOfBandData 成员函数:

  • 0 已成功执行该函数。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

注解

带外数据是一个逻辑上独立的通道,与类型的每对连接套接字关联 SOCK_STREAM 。 通道通常用于发送紧急数据。

MFC 支持带外数据,但不建议使用类的用户 CAsyncSocket 。 更简单的方法是创建另一个套接字用于传递此类数据。 有关带外数据的详细信息,请参阅 Windows 套接字:套接字通知

CAsyncSocket::OnReceive

由框架调用,以通知此套接字存在缓冲区中的数据,可通过调用成员函数来检索这些数据 Receive

virtual void OnReceive(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnReceive 成员函数:

  • 0 已成功执行该函数。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

注解

有关详细信息,请参阅 Windows 套接字:套接字通知

示例

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

由框架调用,以通知套接字现在可以通过调用 Send 成员函数发送数据。

virtual void OnSend(int nErrorCode);

参数

nErrorCode
套接字上的最新错误。 以下错误代码适用于 OnSend 成员函数:

  • 0 已成功执行该函数。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

注解

有关详细信息,请参阅 Windows 套接字:套接字通知

示例

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

向 对象分配新 CAsyncSocket 值。

void operator=(const CAsyncSocket& rSrc);

参数

rSrc
对现有 对象的 CAsyncSocket 引用。

注解

调用此函数将现有 CAsyncSocket 对象复制到另一 CAsyncSocket 个对象。

CAsyncSocket::operator SOCKET

使用此运算符检索 SOCKET 对象的 CAsyncSocket 句柄。

operator SOCKET() const;

返回值

如果成功,为 对象的 SOCKET 句柄;否则为 NULL

注解

可以使用 句柄直接调用 Windows API。

CAsyncSocket::Receive

调用此成员函数以从套接字接收数据。

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

参数

lpBuf
传入数据的缓冲区。

nBufLen
的长度( lpBuf 以字节为单位)。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_PEEK 查看传入数据。 数据将复制到缓冲区中,但不从输入队列中删除。

  • MSG_OOB 处理带外数据。

返回值

如果未发生错误, Receive 则返回收到的字节数。 如果连接已关闭,则返回 0。 否则,将返回 SOCKET_ERROR 值,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAENOTCONN 套接字未连接。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; Receive ShutDown 使用 nHow 设置为0或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞, Receive 操作将被阻止。

  • WSAEMSGSIZE 数据报太大,无法放入指定的缓冲区,并且已被截断。

  • WSAEINVAL 尚未绑定套接字 Bind

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

注解

此函数用于连接的流或数据报套接字,用于读取传入的数据。

对于类型的套接字 SOCK_STREAM ,会返回当前可用的最大信息,直到返回提供的缓冲区大小。 如果套接字已配置为带外数据的内联接收 (套接字选项 SO_OOBINLINE) 并且带外数据已未读,则仅返回带外数据。 应用程序可以使用 IOCtlSIOCATMARK 选项,或 OnOutOfBandData 确定是否仍然需要读取任何带外数据。

对于数据报套接字,将从第一个排队的数据报中提取数据,直到达到所提供的缓冲区大小。 如果数据报大于所提供的缓冲区,则该缓冲区将使用数据报的第一部分进行填充,多余的数据会丢失,并 Receive 返回值,并将 SOCKET_ERROR 错误代码设置为 WSAEMSGSIZE 。 如果套接字中没有可用的传入数据,则返回的值, SOCKET_ERROR 并将错误代码设置为 WSAEWOULDBLOCKOnReceive可以使用回调函数来确定更多数据到达的时间。

如果套接字的类型为 ,并且远程端已正常关闭连接,则 将立即完成,并接收 SOCK_STREAM Receive 0 个字节。 如果连接已重置, Receive 则 将失败并出现错误 WSAECONNRESET

Receive 每次调用 时,只应调用 CAsyncSocket::OnReceive 一次 。

示例

请参阅 的示例 CAsyncSocket::OnReceive

CAsyncSocket::ReceiveFrom

调用此成员函数以接收数据报,将源地址存储在 结构 SOCKADDR 或 中 rSocketAddress

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

参数

lpBuf
传入数据的缓冲区。

nBufLen
的长度( lpBuf 以字节为单位)。

rSocketAddress
对接收 CString 虚线 IP 地址的对象的引用。

rSocketPort
对存储 UINT 端口的 的引用。

lpSockAddr
指向返回 SOCKADDR 时保存源地址的结构的指针。

lpSockAddrLen
指向源地址长度(以字节 lpSockAddr 为单位)的指针。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_PEEK 查看传入数据。 数据将复制到缓冲区中,但不从输入队列中删除。

  • MSG_OOB 处理带外数据。

返回值

如果未发生错误, ReceiveFrom 则返回收到的字节数。 如果连接已关闭,则返回 0。 否则,将返回 SOCKET_ERROR 值,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数无效: lpSockAddr 缓冲区太小,无法容纳对等地址。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEINVAL 尚未绑定套接字 Bind

  • WSAENOTCONN 套接字未连接 (SOCK_STREAM 仅) 。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; ReceiveFrom ShutDown 使用 nHow 设置为0或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞, ReceiveFrom 操作将被阻止。

  • WSAEMSGSIZE 数据报太大,无法放入指定的缓冲区,并且已被截断。

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

注解

此函数用于读取 (可能连接的) 套接字上的传入数据,并捕获从中发送数据的地址。

若要处理 IPv6 地址,请使用 CAsyncSocket::ReceiveFromEx

对于类型的套接字 SOCK_STREAM ,会返回当前可用的最大信息,直到返回提供的缓冲区大小。 如果套接字已配置为带外数据的内联接收 (套接字选项 SO_OOBINLINE) 并且带外数据已未读,则仅返回带外数据。 应用程序可以使用 IOCtlSIOCATMARK 选项,或 OnOutOfBandData 确定是否仍然需要读取任何带外数据。 lpSockAddr lpSockAddrLen 对于套接字,将忽略和参数 SOCK_STREAM

对于数据报套接字,数据是从第一个已成组的数据报中提取的,最多为所提供的缓冲区的大小。 如果数据报大于提供的缓冲区,则缓冲区将填充消息的第一部分,多余的数据将丢失,并返回值 ,错误代码 ReceiveFrom SOCKET_ERROR 设置为 WSAEMSGSIZE

如果 为非零,并且套接字的类型为 ,则发送数据的套接字的网络地址 lpSockAddr SOCK_DGRAM 将复制到相应的 SOCKADDR 结构。 指向的值将初始化为此结构的大小,在返回时进行修改以指示存储在那里 lpSockAddrLen 的地址的实际大小。 如果套接字上没有传入数据,则调用将等待数据到达, ReceiveFrom 除非套接字未阻塞。 在这种情况下,将返回 值 SOCKET_ERROR ,错误代码设置为 WSAEWOULDBLOCKOnReceive回调可用于确定何时到达更多数据。

如果套接字的类型为 ,并且远程端已正常关闭连接,则 将立即完成,并接收 SOCK_STREAM ReceiveFrom 0 个字节。

CAsyncSocket::ReceiveFromEx

调用此成员函数以接收数据报,将源地址存储在 结构中,或存储在 (SOCKADDR rSocketAddress 处理 IPv6 地址) 。

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

参数

lpBuf
传入数据的缓冲区。

nBufLen
的长度( lpBuf 以字节为单位)。

rSocketAddress
对接收 CString 虚线 IP 地址的对象的引用。

rSocketPort
对存储 UINT 端口的 的引用。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_PEEK 查看传入数据。 数据将复制到缓冲区中,但不从输入队列中删除。

  • MSG_OOB 处理带外数据。

返回值

如果未发生错误, ReceiveFromEx 则返回收到的字节数。 如果连接已关闭,则返回0。 否则, SOCKET_ERROR 将返回的值,并且可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpSockAddrLen 参数无效: lpSockAddr 缓冲区太小,无法容纳对等地址。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEINVAL 尚未绑定套接字 Bind

  • WSAENOTCONN 套接字未连接 (SOCK_STREAM 仅) 。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; ReceiveFromEx ShutDown 使用 nHow 设置为0或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞, ReceiveFromEx 操作将被阻止。

  • WSAEMSGSIZE 数据报太大,无法放入指定的缓冲区,并且已被截断。

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

注解

此函数用于读取 (可能连接的) 套接字上的传入数据,并捕获从中发送数据的地址。

此函数与相同 CAsyncSocket::ReceiveFrom ,只不过它处理 IPv6 地址以及较旧的协议。

对于类型的套接字 SOCK_STREAM ,会返回当前可用的最大信息,直到返回提供的缓冲区大小。 如果套接字已配置为带外数据的内联接收 (套接字选项 SO_OOBINLINE) 并且带外数据已未读,则仅返回带外数据。 应用程序可以使用 选项或 来确定是否还有其他带外数据 IOCtlSIOCATMARK OnOutOfBandData 需要读取。 对于 lpSockAddr lpSockAddrLen 套接字,将忽略 SOCK_STREAM 和 参数。

对于数据报套接字,数据是从第一个已成组的数据报中提取的,最多为所提供的缓冲区的大小。 如果数据报大于提供的缓冲区,则缓冲区将填充消息的第一部分,多余的数据将丢失,并返回值 ,错误代码 ReceiveFromEx SOCKET_ERROR 设置为 WSAEMSGSIZE

如果 为非零,并且套接字的类型为 ,则发送数据的套接字的网络地址 lpSockAddr SOCK_DGRAM 将复制到相应的 SOCKADDR 结构。 指向的值将初始化为此结构的大小,在返回时进行修改以指示存储在那里 lpSockAddrLen 的地址的实际大小。 如果套接字上没有传入数据,则调用将等待数据到达, ReceiveFromEx 除非套接字未阻塞。 在这种情况下,将返回 值 SOCKET_ERROR ,错误代码设置为 WSAEWOULDBLOCKOnReceive回调可用于确定何时到达更多数据。

如果套接字的类型为 ,并且远程端已正常关闭连接,则 将立即完成,并接收 SOCK_STREAM ReceiveFromEx 0 个字节。

CAsyncSocket::Send

调用此成员函数以在连接的套接字上发送数据。

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

参数

lpBuf
包含要传输的数据的缓冲区。

nBufLen
数据的长度(以 lpBuf 字节为单位)。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_DONTROUTE 指定数据不应受路由限制。 Windows 套接字供应商可以选择忽略此标志。

  • MSG_OOB 仅发送带外 (SOCK_STREAM 数据) 。

返回值

如果未发生错误, Send 则返回发送的字符总数。 (注意,此值可能小于指示的数字 nBufLen 。 ) 否则,返回的值 SOCKET_ERROR ,并且可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEACCES 请求的地址是广播地址,但未设置适当的标志。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEFAULTlpBuf 参数不在用户地址空间的有效部分。

  • WSAENETRESET 必须重置连接,因为 Windows 套接字实现已将其删除。

  • WSAENOBUFS Windows 套接字实现报告缓冲区死锁。

  • WSAENOTCONN 套接字未连接。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; Send ShutDown 使用 nHow 设置为1或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞,请求的操作将被阻止。

  • WSAEMSGSIZE 套接字的类型为 SOCK_DGRAM ,并且数据报大于 Windows 套接字实现所支持的最大值。

  • WSAEINVAL 尚未绑定套接字 Bind

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

注解

Send 用于写入已连接的流或数据报套接字上的传出数据。 对于数据报套接字,必须注意不要超出基础子网的最大 IP 数据包大小,该大小由 iMaxUdpDg 返回的结构中的元素提供 WSADATA AfxSocketInit 。 如果数据太长,无法以原子方式通过基础协议传递,则错误通过 返回, WSAEMSGSIZE GetLastError 并且不会传输任何数据。

请注意,对于数据报套接字,成功完成 Send 并不表示已成功传递数据。

在 类型的对象上,写入的字节数可以介于 1 和请求的长度之间,具体取决于本地和外主机上的 CAsyncSocket SOCK_STREAM 缓冲区可用性。

示例

请参阅 的示例 CAsyncSocket::OnSend

CAsyncSocket::SendTo

调用此成员函数以将数据发送到特定目标。

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

参数

lpBuf
包含要传输的数据的缓冲区。

nBufLen
数据的长度(以 lpBuf 字节为单位)。

nHostPort
标识套接字应用程序的端口。

lpszHostAddress
此对象连接到的套接字的网络地址:计算机名称(如"ftp.microsoft.com"或点线数字,如"128.56.22.8"。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_DONTROUTE 指定数据不应受路由限制。 Windows 套接字供应商可以选择忽略此标志。

  • MSG_OOB 仅发送带外 (SOCK_STREAM 数据) 。

lpSockAddr
指向包含 SOCKADDR 目标套接字地址的结构的指针。

nSockAddrLen
地址的长度(以 lpSockAddr 字节为单位)。

返回值

如果未发生错误, SendTo 则返回发送的字符总数。 (请注意,此值可能小于 .) 否则,将返回 值,并且可以通过调用 检索 nBufLen SOCKET_ERROR 特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEACCES 请求的地址是广播地址,但未设置适当的标志。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEFAULTlpBuflpSockAddr 参数不是用户地址空间的一部分,或者 lpSockAddr 参数太小 (小于 SOCKADDR 结构) 的大小。

  • WSAEINVAL 主机名无效。

  • WSAENETRESET 必须重置连接,因为 Windows 套接字实现已将其删除。

  • WSAENOBUFS Windows 套接字实现报告缓冲区死锁。

  • WSAENOTCONN 套接字未连接 (SOCK_STREAM 仅) 。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; SendTo ShutDown 使用 nHow 设置为1或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞,请求的操作将被阻止。

  • WSAEMSGSIZE 套接字的类型为 SOCK_DGRAM ,并且数据报大于 Windows 套接字实现所支持的最大值。

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

  • WSAEADDRNOTAVAIL 指定的地址在本地计算机上不可用。

  • WSAEAFNOSUPPORT 指定系列中的地址不能用于此套接字。

  • WSAEDESTADDRREQ 需要目标地址。

  • WSAENETUNREACH 此时无法从此主机访问网络。

注解

SendTo 用于数据报或流套接字,用于在套接字上写入传出数据。 对于数据报套接字,必须注意不要超过基础子网的最大 IP 数据包大小,该大小由 填充的 结构中的元素 iMaxUdpDg WSADATA 提供 AfxSocketInit 。 如果数据太长,无法以原子方式通过基础协议传递,则返回错误 WSAEMSGSIZE,并且不会传输任何数据。

请注意,成功完成 并不 SendTo 表示已成功传递数据。

SendTo 仅在套接字上 SOCK_DGRAM 用于将数据报发送到由 参数标识的特定 lpSockAddr 套接字。

若要仅在 (上发送广播) ,则参数中的地址应该使用 Windows 套接字头文件) 中定义的特殊 IP 地址 SOCK_DGRAM lpSockAddr INADDR_BROADCAST WINSOCK.H (以及预期的端口号来构造。 或者,如果 lpszHostAddress 参数为 NULL ,则套接字配置为广播。 广播数据报通常不能超过发生碎片的大小,这意味着数据报的数据部分(不包括标头 ()不应超过 512) 字节。

若要处理 IPv6 地址,请使用 CAsyncSocket::SendToEx

CAsyncSocket::SendToEx

调用此成员函数以将数据发送到处理 IPv6 地址 (特定) 。

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

参数

lpBuf
包含要传输的数据的缓冲区。

nBufLen
数据的长度(以 lpBuf 字节为单位)。

nHostPort
标识套接字应用程序的端口。

lpszHostAddress
此对象连接到的套接字的网络地址:计算机名称(如"ftp.microsoft.com"或点线数字,如"128.56.22.8"。

nFlags
指定调用的方式。 此函数的语义由套接字选项和 参数 nFlags 确定。 后者通过将以下任何值与 C++ 按位 OR 运算符组合在一起 | () :

  • MSG_DONTROUTE 指定数据不应受路由限制。 Windows 套接字供应商可以选择忽略此标志。

  • MSG_OOB 仅) (发送带外数据 SOCK_STREAM

返回值

如果未发生错误,则 SendToEx 返回已发送的字符总数。 (注意,此值可能小于指示的数字 nBufLen 。 ) 否则,返回的值 SOCKET_ERROR ,并且可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEACCES 请求的地址是广播地址,但未设置适当的标志。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEFAULTlpBuflpSockAddr 参数不是用户地址空间的一部分,或者 lpSockAddr 参数太小 (小于 SOCKADDR 结构) 的大小。

  • WSAEINVAL 主机名无效。

  • WSAENETRESET 必须重置连接,因为 Windows 套接字实现已将其删除。

  • WSAENOBUFS Windows 套接字实现报告缓冲区死锁。

  • WSAENOTCONN 套接字未连接 (SOCK_STREAM 仅) 。

  • WSAENOTSOCK 描述符不是套接字。

  • WSAEOPNOTSUPP``MSG_OOB已指定,但套接字的类型不是 SOCK_STREAM

  • WSAESHUTDOWN 套接字已关闭; SendToEx ShutDown 使用 nHow 设置为1或2的调用后,不能对套接字调用。

  • WSAEWOULDBLOCK 套接字标记为非阻塞,请求的操作将被阻止。

  • WSAEMSGSIZE 套接字的类型为 SOCK_DGRAM ,并且数据报大于 Windows 套接字实现所支持的最大值。

  • WSAECONNABORTED 由于超时或其他故障,虚拟线路已中止。

  • WSAECONNRESET 远程端重置了虚拟线路。

  • WSAEADDRNOTAVAIL 指定的地址无法从本地计算机获得。

  • WSAEAFNOSUPPORT 指定系列中的地址不能用于此套接字。

  • WSAEDESTADDRREQ 目标地址是必需的。

  • WSAENETUNREACH 此时无法从此主机访问网络。

注解

此方法与 相同 CAsyncSocket::SendTo ,只不过它处理 IPv6 地址以及较旧的协议。

SendToEx 用于数据报或流套接字,用于在套接字上写入传出数据。 对于数据报套接字,必须注意不要超过基础子网的最大 IP 数据包大小,该大小由 填充的 结构中的元素 iMaxUdpDg WSADATA 提供 AfxSocketInit 。 如果数据太长,无法以原子方式通过基础协议传递,则返回错误, WSAEMSGSIZE 并且不会传输任何数据。

请注意,成功完成 并不 SendToEx 表示已成功传递数据。

SendToEx 仅在套接字上 SOCK_DGRAM 用于将数据报发送到由 参数标识的特定 lpSockAddr 套接字。

若要仅在 (上发送广播) ,则参数中的地址应该使用 Windows 套接字头文件) 中定义的特殊 IP 地址 SOCK_DGRAM lpSockAddr INADDR_BROADCAST WINSOCK.H (以及预期的端口号来构造。 或者,如果 lpszHostAddress 参数为 NULL ,则套接字配置为广播。 广播数据报通常不能超过发生碎片的大小,这意味着数据报的数据部分(不包括标头 ()不应超过 512) 字节。

CAsyncSocket::SetSockOpt

调用此成员函数以设置套接字选项。

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

参数

nOptionName
要设置其值的套接字选项。

lpOptionValue
指向提供所请求选项的值的缓冲区的指针。

nOptionLen
缓冲区的大小 lpOptionValue (以字节为单位)。

nLevel
定义选项的级别;唯一支持的级别是 SOL_SOCKETIPPROTO_TCP

返回值

如果函数成功,则为非零值;否则为0,可以通过调用来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISED 必须在 AfxSocketInit 使用此 API 之前成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统出现故障。

  • WSAEFAULTlpOptionValue 不在进程地址空间的有效部分。

  • WSAEINPROGRESS 正在进行阻止型 Windows 套接字操作。

  • WSAEINVALnLevel 无效,或中的信息无效 lpOptionValue

  • WSAENETRESET 设置时连接超时 SO_KEEPALIVE

  • WSAENOPROTOOPT 选项未知或不受支持。 特别是,在 SO_BROADCAST 类型为的套接字上,不支持、、、 SOCK_STREAM SO_DONTLINGER SO_KEEPALIVE SO_LINGERSO_OOBINLINE SOCK_DGRAM

  • WSAENOTCONN 设置后连接已重置 SO_KEEPALIVE

  • WSAENOTSOCK 描述符不是套接字。

注解

SetSockOpt 设置与任何类型的套接字关联的套接字选项的当前值(以任何状态表示)。 尽管选项可以存在于多个协议级别,但此规范仅定义位于最上面的 "套接字" 级别的选项。 选项会影响套接字操作,例如是否在正常数据流中接收加急数据、是否可以在套接字上发送广播消息等等。

有两种类型的套接字选项:启用或禁用功能或行为的布尔选项,以及需要整数值或结构的选项。 若要启用布尔选项,请 lpOptionValue 指向非零整数。 若要禁用该选项,请 lpOptionValue 指向等于零的整数。 nOptionLensizeof(BOOL)对于布尔选项,应等于。 对于其他选项, lpOptionValue 指向包含选项所需值的整数或结构, nOptionLen 是整数或结构的长度。

SO_LINGER 控制未发送消息在套接字上排队并调用 函数以 Close 关闭套接字时采取的操作。

默认情况下,不能将套接字绑定到 (,) Bind 已使用的本地地址。 但是,有时可能需要这样"重用"地址。 由于每个连接都由本地地址和远程地址的组合唯一标识,因此只要远程地址不同,将两个套接字绑定到同一本地地址就没有任何问题。

若要通知 Windows 套接字实现,不应禁止对套接字的调用,因为所需的地址已被另一个套接字使用,应用程序应在发出调用之前为套接字设置套接字选项。 Bind SO_REUSEADDR Bind 请注意,选项仅在调用时解释:因此,不需要 (但) 在未绑定到现有地址的套接字上设置选项,在调用后设置或重置选项对此套接字或任何其他套接字不起作用。 Bind Bind

应用程序可以通过打开套接字选项,请求 Windows 套接字实现在传输控制协议 (TCP) 连接上启用"保持连接" SO_KEEPALIVE 数据包。 Windows 套接字实现不需要支持使用 keep-alives:如果支持,则精确语义特定于实现,但应符合 RFC 1122 的第 4.2.3.6 节:"Internet 主机的要求 - 通信层"。 如果连接因"keep-alives"而被删除,错误代码将返回到套接字上正在进行的任何调用,并且任何后续 WSAENETRESET 调用都将失败,并返回 WSAENOTCONN

TCP_NODELAY选项禁用 Nagle 算法。 Nagle 算法用于通过缓冲未确认的发送数据来减少主机发送的小数据包数,直到可以发送完整大小的数据包。 但是,对于某些应用程序,此算法可能会影响性能,并 TCP_NODELAY 可用于将其关闭。 不应设置应用程序编写器 TCP_NODELAY ,除非此操作的影响非常熟悉且需要,因为设置 TCP_NODELAY 可能会对网络性能产生负面影响。 TCP_NODELAY 是唯一受支持的套接字选项,它使用 level IPPROTO_TCP ; 所有其他选项都使用 level SOL_SOCKET

如果应用程序设置了此选项,Windows 套接字的某些实现将提供输出调试信息 SO_DEBUG

支持以下选项 SetSockOpt 。 类型标识由寻址的数据的类型 lpOptionValue

类型 含义
SO_BROADCAST BOOL 允许在套接字上传输广播消息。
SO_DEBUG BOOL 记录调试信息。
SO_DONTLINGER BOOL 请勿阻止 Close 正在等待发送未发送的数据。 设置此选项相当于设置 SO_LINGER l_onoff 为零的设置。
SO_DONTROUTE BOOL 不路由:直接发送到接口。
SO_KEEPALIVE BOOL 发送 keep-alive。
SO_LINGER struct LINGER 逗留 Close 未发送的数据是否存在。
SO_OOBINLINE BOOL 接收正常数据流中的带外数据。
SO_RCVBUF int 指定接收的缓冲区大小。
SO_REUSEADDR BOOL 允许将套接字绑定到已在使用中的地址。 (参见 Bind。 )
SO_SNDBUF int 指定发送的缓冲区大小。
TCP_NODELAY BOOL 为发送合并禁用 Nagle 算法。

不支持的 Berkeley 软件分发 (BSD) 选项 SetSockOpt

类型 含义
SO_ACCEPTCONN BOOL 套接字正在侦听
SO_ERROR int 获取错误状态并清除。
SO_RCVLOWAT int 接收低水位线。
SO_RCVTIMEO int 接收超时
SO_SNDLOWAT int 发送低水位线。
SO_SNDTIMEO int 发送超时。
SO_TYPE int 套接字的类型。
IP_OPTIONS 在 IP 标头中设置选项字段。

CAsyncSocket::ShutDown

调用此成员函数以禁用套接字上的发送和/或接收。

BOOL ShutDown(int nHow = sends);

参数

nHow
一个标志,该标志描述将不再允许的操作类型,使用下列枚举值:

  • receives = 0

  • sends = 1

  • both = 2

返回值

如果函数成功,则不为零;否则为 0,并且可以通过调用 来检索特定的错误代码 GetLastError 。 以下错误适用于此成员函数:

  • WSANOTINITIALISEDAfxSocketInit 使用此 API 之前,必须成功。

  • WSAENETDOWN Windows 套接字实现检测到网络子系统失败。

  • WSAEINVALnHow 无效。

  • WSAEINPROGRESS 正在执行阻止 Windows 套接字操作。

  • WSAENOTCONN 套接字未连接 (SOCK_STREAM 仅) 。

  • WSAENOTSOCK 描述符不是套接字。

注解

ShutDown 用于所有类型的套接字,以禁用接收和/或传输。 如果 为 0,则不允许对套接字 nHow 进行后续接收。 这不会影响较低协议层。

对于传输控制协议 (TCP) ,不会更改 TCP 窗口,并且会接受传入数据 (但在窗口耗尽之前,不会) 确认。 对于用户数据报协议 (UDP) ,会接受并排队传入的数据报。 在任何情况下,都不会生成 ICMP 错误数据包。 如果 nHow 为1,则不允许后续发送。 对于 TCP 套接字,将发送一个 FIN。 设置 nHow 为2将禁用发送和接收,如上所述。

请注意,不会 ShutDown 关闭套接字,在调用之前,不会释放附加到套接字的资源 Close 。 应用程序不应依赖于在关闭套接字后是否能够重复使用它。 特别是,Windows 套接字实现不需要支持 Connect 在此类套接字上使用。

示例

请参阅的示例 CAsyncSocket::OnReceive

CASyncSocket::Socket

分配套接字句柄。

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

参数

nSocketType
指定 SOCK_STREAMSOCK_DGRAM

lEvent
一个位掩码,指定应用程序感兴趣的网络事件的组合。

  • FD_READ:希望接收有关读取准备情况的通知。

  • FD_WRITE:希望接收有关写入准备情况的通知。

  • FD_OOB:希望接收带外数据到达时的通知。

  • FD_ACCEPT:希望接收传入连接的通知。

  • FD_CONNECT:希望接收已完成连接的通知。

  • FD_CLOSE:希望接收套接字关闭通知。

nProtocolType
要与特定于指定地址系列的套接字一起使用的协议。

nAddressFormat
地址系列规范。

返回值

成功时返回 TRUE,失败时返回 FALSE

注解

此方法分配套接字句柄。 它不会调用 将套接字绑定到指定地址,因此稍后需要调用 以 CAsyncSocket::Bind Bind 将套接字绑定到指定的地址。 可以使用 在 CAsyncSocket::SetSockOpt 绑定套接字选项之前设置它。

请参阅

CObject
层次结构图表
CSocket
CSocketFile