学习笔记(02):C++网络编程进阶-WSA系列API函数

立即学习:https://edu.csdn.net/course/play/6082/113744?utm_source=blogtoedu

WSA

Windows Sockets Asynchronous

socket与WSASocket的区别

socket() 函数创建一个通讯节点并返回一个套接字,如果是阻塞套接字时,相应api会阻塞。

WSASocket()的发送操作和接收操作都可以被重叠使用,接收函数可以被多次调用,发出接收缓冲区,准备接收到来的数据,发送函数也可以被多次调用,组成一个发送缓冲区队列,课时socket()却只能发过之后等待回消息才可做下一步操作。

 

WSAStartup函数:用于初始化供进程调用的Winsock相关的dll文件

int WSAStartup(IN WORD wVersionRequested,OUT LPWADDATA lpWSAData);

参数:

 

WSASocket函数:创建一个与指定传送服务器提供者捆绑的套接字,可选的创建和加入一个套接字组

SOCKET WSASocket(int af , int type , int protocol , LPWSAPROTOCOL_INFO lpProtocolInfo,GROUP g,DWORD dwFlags);

参数:

第一个参数 地址族规范,如AF_INET

第二个参数套接字类型,SOCK_STREAM , 数据报SOCK_DGRAM

第三个参数套接字使用的协议,不愿指定协议则为0

第四个参数结构体指针如果本参数非0,则前三个参数被忽略

第五个参数现有套接字

第六个参数套接字属性描述标志,如:WSA_FLAG_OVERLAPPED

返回值:

成功就返回新创建的套接字的描述符

失败返回INVALID_SOCKET

 

WSAConnect函数:是Winsock2版本中的连接函数,作用是创建一个远端的连接,交换了解数据,并根据提供的流确定所需的服务质量。

int WSAConnect(SOCKET s,const struct sockaddr FAR*name,int namelen,LPWSABUF lpCallerData,LPWSABUF lpcalleeData,LPQOS lpSQOS , LPQOS lpGQOS)

参数:

第一个参数表示一个未连接套接字的描述字

第二个参数表示远端地址

第三个参数地址长度

第四个参数表示指向的数据在建立连接时将传送到的远端

第五个参数:指向的数据在建立连接时将从远端传送回本机

第六个参数:指向套接字s流描述的指针,每个方向一个

第七个参数:指向套接字组流描述的指针(如果有套接字组的话)

返回值:

成功返回0

失败返回SOCKET_ERROR ,通过WSAGetLastError

()获取。

 

WSAAccept函数:有条件接收一个连接基于状态函数的返回值,选择创建或加入一个套接字组,提供QOS flowspecs,允许连接数据的转移。

SOCKET WSAAccept(SOCKET s,struct sockaddr FAR *addr , LPINT addrlen , LPCONDITIONPROC LpfnCondition,DWORD dwCallbackData)

参数:

第一个参数:表示一个套接字的描述字, 该套接字在listen()后监听连接。

第二个参数:链接地址的缓冲区的地址

第三个参数:地址大小

第四个参数:用户提供的条件函数的进程实例地址,该函数根据参数传入的调用者信息作出接收或拒绝的决定,并通过给结构参数赋予特定的值来创建或加入一个套接字组

第五个参数:作物条件函数参数返回给应用程序的回调数据

返回值:

成功返回所接受套接字的描述字,失败返回INVALID_SOCKET

 

WSAReve函数:在recv的基础上增加了一些新特性,比如重叠I/O和部分数据报通知

int WSARecv(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMP;ETION_ROUTINE lpCompletionRoutine);

参数:

第一个参数:是投递这个操作的套接字

第二个参数:接收缓冲区,是WSABUF结构数组

第三个参数:数组中WSABUF结构的数量

第四个参数:如果接收操作立即完成,返回函数调用所接受到的字节数

第五个参数:甚至为0即可

第六个参数:绑定 重叠结构

第七个参数:完成例程中的参数,我们这里设置为NULL

返回值:

成功返回0,完成例程将在调用线程处于alertable状态是被调用

失败返回SOCKET_ERROR的值,并通过WSAGetLastError错误代码,

 

WSARecvEX函数:本质调用recv函数从TCP连接的另一端接收数据

int WSARecvEX(SOCKET s , char * buf , int len , int *flags)

参数:

第一个参数:为客户端的socket描述字

第二个参数:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据

第三个参数:指明buf的长度

第四个参数:指定消息是否完全或者部分接收到数据报套接字的指示符。

返回值:

成功时返回接收到的字节数, 错误返回SOCKET_ERROR,连接关闭返回0

如果接收到部分消息,则在flags参数总设置MSG_PATIAL

如果接收到完整消息,则不设置

 

WSASend函数:增条标准的send函数,可用于重叠socket()上已进行重叠发送的

int WSASend(SOCKET s , LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPER lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompleteRoutine)

参数:

第一个参数:标识一个已连接的描述字

第二个参数:一个指向WSABUF结构数组的指针

第三个参数:lpBuffers中WSABUF结构的数目

第四个参数:如果发送操作立即完成,则为一个指向所发送数据字节数的指针

第五个参数:标志位

第六个参数:指向WSAOVERLAPPED 结构的指针(对于非重叠套接字则忽略)

第七个参数:一个指向发送操作完成后调用的完成例程的指针(对于非重叠套接字则忽略)

返回值:

成功返回0,完成例程将在调用线程处理alertable状态被调用

否则返回SOCKET_ERROR的值,并通过调用WSAGetLastError来检索特定的错误代码。

 

WSAGetLastError函数:返回上次发生的网络错误代码

int WSAGetLastError(void)

返回值:指出了该线程进行的上一次Window Socket API函数调用的错误代码

 

常用的错误代码

10035WSAEROULDBLOCK:资源暂时不可用,对于非阻塞套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误,比如在一个非阻塞的套接字上调用connect,就会返回这个错误,因为连接请求不能立即执行

10054WASECONNRESET:连接被对方重置,一个已经建立的连接被远程主机强行关闭,若远程主机上的进程异常终止(由于内存冲突或者硬件故障),或者针对套接字执行了一次强行关闭,便会产生这样的错误,针对强行关闭的情况, 可用SO_LINGER套接字选项和setsockopt来配置套接字

WSAECONNREFUSED:连接被拒,由于被目标服务器拒绝,连接无法建立,这通常是由于在远程机器上没有任何应用程序可在那个地址之上为连接提供服务

 

 

 

 

你可能感兴趣的:(研发管理,网络编程,c语言,c++,socket,C/C++)