打怪升级之CSocket基本方法

声明:信息来源自Windows官方中文文档,本文是将文档各处不同的信息做一个汇总方便使用,侵权马上删除。

基本方法

其实就三类基本方法:

1.如何建立
2.如何发送
3.如何接收

如何建立

文档:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/csocket-class?view=msvc-170#create.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

参数:

1.nSocketPort
要与套接字一起使用的特定端口,如果希望 MFC 选择端口,则为 0。

2.nSocketType
SOCK_STREAM 或 SOCK_DGRAM。

3.lpszSocketAddress
指向包含已连接套接字的网络地址(用点号分隔的数字,如“128.56.22.8”)的字符串的指针。 传递此参数的 NULL 字符串表示 CSocket 实例应侦听所有网络接口上的客户端活动。
返回值

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

注解:

Create 然后调用 Bind 将套接字绑定到指定地址。 支持以下套接字类型:

SOCK_STREAM 提供有序、可靠、双向、基于连接的字节流。 使用 Internet 地址系列的传输控制协议 (TCP)。

SOCK_DGRAM 支持数据报,即最大长度固定(通常很小)的无连接、不可靠缓冲区。 对 Internet 地址系列使用用户数据报协议 (UDP)。 要使用此选项,不能将套接字与 CArchive 对象一起使用。

如何发送

调用CAsyncSocket类的sendto函数:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/casyncsocket-class?view=msvc-170#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);

参数:

1.lpBuf
一个包含要传输的数据的缓冲区。

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

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

4.lpszHostAddress
此对象连接到的套接字的网络地址:计算机名称(如“ftp.microsoft.com”)或以点分隔的数字(如“128.56.22.8”)。

5.nFlags
指定进行调用的方式。 此函数的语义取决于套接字选项和 nFlags 参数。 后者是通过将以下任何值与 C++ 按位或运算符 (|) 组合使用来构造的:

MSG_DONTROUTE:指定数据不应受到路由的约束。 Windows 套接字供应商可以选择忽略此标志。

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

6.lpSockAddr
一个指向 SOCKADDR 结构的指针,该结构包含目标套接字的地址。

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

返回值:

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

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

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

WSAEACCES:请求的地址是广播地址,但相应的标志未设置。

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

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

WSAEINVAL:主机名无效。

WSAENETRESET:必须重置连接,因为 Windows 套接字实现删除了连接。

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

WSAENOTCONN:套接字未连接(仅限 SOCK_STREAM)。

WSAENOTSOCK:描述符不是套接字。

WSAEOPNOTSUPP 已指定 MSG_OOB,但套接字不是类型 SOCK_STREAM。

WSAESHUTDOWN:套接字已关闭;在将 nHow 设置为 1 或 2 的情况下调用 ShutDown 后,无法在套接字上调用 SendTo。

WSAEWOULDBLOCK:套接字标记为非阻止,请求的操作会进行阻止。

WSAEMSGSIZE:套接字的类型为 SOCK_DGRAM,数据报大于 Windows 套接字实现支持的最大大小。

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

WSAECONNRESET:虚拟线路已由远端重置。

WSAEADDRNOTAVAIL:指定的地址不能从本地计算机使用。

WSAEAFNOSUPPORT:指定的系列中的地址无法与此套接字配合使用。

WSAEDESTADDRREQ:需要目标地址。

WSAENETUNREACH:此时不可从此主机访问该网络。

注解:

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

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

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

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

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

如何接收

简单的办法是使用Receive函数:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/casyncsocket-class?view=msvc-170#receive

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

参数:

1.lpBuf
传入数据的缓冲区。

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

3.nFlags
指定进行调用的方式。 此函数的语义取决于套接字选项和 nFlags 参数。 后者是通过将以下任何值与 C++ 按位或运算符 (|) 组合使用来构造的:

MSG_PEEK:速览传入数据。 数据会复制到缓冲区中,但不会从输入队列中删除。

MSG_OOB:处理带外数据。

返回值:

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

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

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

WSAENOTCONN:套接字未连接。

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

WSAENOTSOCK:描述符不是套接字。

WSAEOPNOTSUPP 已指定 MSG_OOB,但套接字不是类型 SOCK_STREAM。

WSAESHUTDOWN:套接字已关闭;在将 nHow 设置为 0 或 2 的情况下调用 ShutDown 后,无法在套接字上调用 Receive。

WSAEWOULDBLOCK:套接字标记为非阻止,Receive 操作会进行阻止。

WSAEMSGSIZE:数据报太大,无法放入指定的缓冲区,因此被截断。

WSAEINVAL:尚未使用 Bind 绑定套接字。

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

WSAECONNRESET:虚拟线路已由远端重置。

注解:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Carchive 是一个MFC类,用于在计算机程序中对数据进行归档、存储和检索。它提供了对序列化对象和数据进行管理的功能。 Carchive 可以将对象和数据序列化到文件或内存缓冲区,并可以根据需要进行反序列化以恢复对象和数据。它支持多种存储格式,如二进制、文本和XML。使用Carchive,可以轻松地将复杂的对象层次结构保存到文件中,并在需要时进行检索和重新加载。 Carchive 提供了一组成员函数,用于操作数据的序列化和反序列化。它们包括 Serialize、Read、Write 和 GetFile。 Carchive 类似于一个桥梁,将程序中的数据和对象与存储设备连接起来。它提供了在存储设备上读取和写入数据的方法,使得程序能够从存储设备中加载数据,并将数据保存到存储设备中。 与Carchive相对应的是Csocket,它是一个用于网络编程的MFC类。Csocket 提供了与网络通信相关的功能,例如创建套接字、连接到远程主机、接收和发送数据等。 使用Csocket,可以轻松地实现客户端和服务器之间的通信。它支持多种通信协议,如TCP和UDP。通过Csocket,程序可以与远程主机建立连接,并在连接上进行数据传输。 Csocket 提供了一组成员函数,用于初始化套接字、连接远程主机、发送和接收数据等操作。它还提供了一些事件和回调函数,以便程序能够处理与网络通信相关的事件。 总之,Carchive 和 CsocketMFC提供的两个有用的类。Carchive 可以帮助程序对数据进行归档和检索,而Csocket 则提供了与网络通信相关的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考琪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值