声明:信息来源自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 一次。