• 以WSA开头的API,结合了Windows平台特性


    Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,对网络事件采用了基于消息的异步存取策略;

    1、WSAAsyncSelect

      该函数为指定的套接字(socket)请求基于Windows消息的网络事件通知,并自动将该套接字设置为非阻塞模式;

      int WSAAsyncSelect (

        SOCKET s,

        HWND hWnd,         

        unsigned int wMsg, 

        long lEvent        

      );

        s:标识请求网络事件通知的套接字;

        hWnd:标识一个网络事件发生时接收消息的窗口的句柄;

        wMsg:指定网络事件发生时窗口将接收到的消息;

        lEvent:指定应用程序感兴趣的网络事件,包括:

          FD_READ  --有关是否可读的通知,以便读取数据

          FD_WRITE  --有关是否可写的通知,以便发送数据

          FD_OOB  --是否带外(OOB)数据抵达的通知

          FD_ACCEPT  --与进入连接有关的通知

          FD_CONNECT  --连接操作已完成的通知

          FD_CLOSE  --与套接字关闭有关的通知

          FD_QOS  --套接字“服务质量”发生更改的通知

          FD_GROUP_QOS  --套接字组“服务质量”发生更改的通知

          FD_ROUTING_INTERFACE_CHANGE  --在指定的方向上,与路由接口发生变化有关的通知

          FD_ADDRESS_LIST_CHANGE  --针对套接字的协议家族,本地地址列表发生变化的通知

    2、WSAEnumProtocols

      该函数可获得系统中安装的网络协议的相关信息,该函数不能重复调用,传入的缓冲区必须足够大以便能存放所有元素;

      int WSAEnumProtocols (

          LPINT lpiProtocols,                  

          LPWSAPROTOCOL_INFO lpProtocolBuffer, 

          ILPDWORD lpdwBufferLength            

      );

          lpiProtocols:一个以NULL结尾的协议标识号数组;如果为NULL,则该函数返回所有可用协议的信息,否则只返回数组中列出的协议信息;

          lpProtocolBuffer:作为返回值使用,一个用WSAPROTOCOL_INFO结构体填充的缓冲区;WSAPROTOCOL_INFO结构体用来存放或得到一个指定协议的完整信息;

          lpdwBufferLength:在输入时,指定传递给该函数的参数lpProtocolBuffer缓冲区的长度;在输出时,存有获取所有请求信息需传递给该函数的最小缓冲区的长度;

    3、WSAStartup

      该函数将初始化进程使用的socket库;

      int WSAStartup (

          WORD wVersionRequested, 

          LPWSADATA lpWSAData 

      );

          wVersionRequested:可以使用的socket库的版本;高位字节指定库的副版本,低位字节为主版本;

          lpWSAData:返回可用库的信息,是一个指向WSADATA数据结构类型变量的指针;

    4、WSACleanup

      该函数将终止程序对socket库的使用;

      int WSACleanup();

    5、WSASocket

      该函数将创建套接字;

      SOCKET WSASocket (

          int af,                            

          int type,                          

          int protocol,                      

          LPWSAPROTOCOL_INFO lpProtocolInfo, 

          GROUP g,                           

          DWORD dwFlags                      

      );

          af:指定地址族,AF_UNIX/AF_LOCAL/AF_FILE--本地通信;AF_INET--网络通信IPv4(主用);AF_INET6--网络通信IPv6(前缀AF替换成PF效果一样);

          type:指定socket类型,SOCK_STREAM--流式套接字,SOCK_DGRAM--数据报式套接字;

          protocol:推荐为0;

          lpProtocolInfo:一个指向WSAPROTOCOL_INFO结构体的指针,该结构体定义了所创建的套接字的特性;可以为NULL;

          g:保留参数;

          dwFlags:指定套接字属性的描述;如果设为WSA_FLAG_OVERLAPPED,将创建一个重叠套接字;

    6、WSARecv---recv函数的扩展版本

      int WSARecv (

          SOCKET s,                                               

          LPWSABUF lpBuffers,                                    

          DWORD dwBufferCount,                                   

          LPDWORD lpNumberOfBytesRecvd,                          

          LPDWORD lpFlags,                                        

          LPWSAOVERLAPPED lpOverlapped,                          

          LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE 

      );

    7、WSASend---send函数的扩展版本

      int WSASend (

          SOCKET s,                                              

          LPWSABUF lpBuffers,                                    

          DWORD dwBufferCount,                                   

          LPDWORD lpNumberOfBytesSent,                           

          DWORD dwFlags,                                         

          LPWSAOVERLAPPED lpOverlapped,                           

          LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE 

      );

    8、WSARecvFrom---recvfrom函数的扩展版本

      该函数接收数据报类型的数据,并保存数据发送方的地址;通过该函数的第2个参数可知,在调用该函数接收数据时,可同时定义多个WSABUF结构体变量来接收数据,并通过该函数的第3个参数指定WSABUF结构体的数量;

      int WSARecvFrom (

          SOCKET s,                                               

          LPWSABUF lpBuffers,                                    

          DWORD dwBufferCount,                                   

          LPDWORD lpNumberOfBytesRecvd,                          

          LPDWORD lpFlags,                                        

          struct sockaddr FAR * lpFrom,                          

          LPINT lpFromlen,                                       

          LPWSAOVERLAPPED lpOverlapped,                          

          LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE 

      );

          s:标识套接字;

          lpBuffers:指向WSABUF结构体数组的指针,该结构体的定义为:

            typedef struct __WSABUF{

              u_long len;     //缓冲区的长度

              char FAR *buf;  //指向缓冲区的指针

            }WSABUF, FAR * LPWSABUF;

          dwBufferCount:lpBuffers数组中WSABUF结构体的数目;

          lpNumberOfBytesRecvd:指向本次调用所接收的字节数的指针;

          lpFlags:取值包括:

            MSG_PEEK  --浏览到来的数据,这些数据被复制到缓冲区,但并不从输入队列中移除;仅对非重叠套接字有效;

            MSG_OOB  --处理带外(OOB)数据

            MSG_PARTIAL  --仅用于面向消息的套接字;作为输出参数时,表明数据是发送方传送的消息的一部分,消息的剩余部分将在随后的接收操作中被传送,如果随后的某个接收操作没有此标志,就表明这是发送方发送的消息的尾部;作为输入参数时,表明接收操作已完成,即使只是一条消息的部分数据已被服务提供者所接收;

          lpFrom:一个可选的指针,指向重叠操作完成后存放源地址的缓冲区;

          lpFromlen:一个指向lpFrom指定的缓冲区大小的指针,仅当指定了lpFrom参数时才须使用该参数;

          lpOverlapped:一个指向WSAOVERLAPPED结构体的指针,非重叠套接字则忽略此参数;

          lpCompletionROUTINE:一个指向接收操作完成时调用的完成例程的指针,该例程实际上就是如下所示的一个回调函数,非重叠套接字则忽略此参数;

            void CALLBACK CompletionROUTINE(

              IN DWORD dwError,

              IN DWORD cbTransferred,

              IN LPWSAOVERLAPPED lpOverlapped,

              IN DWORD dwFlags

            );

    9、WSASendTo---sendto函数的扩展版本

      int WSASendTo (

          SOCKET s,                                              

          LPWSABUF lpBuffers,                                    

          DWORD dwBufferCount,                                    

          LPDWORD lpNumberOfBytesSent,                           

          DWORD dwFlags,                                         

          const struct sockaddr FAR * lpTo,                      

          int iToLen,                                             

          LPWSAOVERLAPPED lpOverlapped,                          

          LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE 

      );

          s:标识一个套接字

          lpBuffers:一个指向WSABUF结构体的指针;

          dwBufferCount:lpBuffers数组中WSABUF结构体的数目;

          lpNumberOfBytesSent:一个指向本次调用所发送的字节数的指针;

          dwFlags:指示影响操作行为的标志位,设为0;

          lpTo:可选指针,指向目标套接字的地址;

          iToLen:lpTo中地址的长度;

          lpOverlapped:一个指向WSAOVERLAPPED结构体的指针,非重叠套接字忽略该参数;

          lpCompletionROUTINE:一个指向接收操作完成时调用的完成例程的指针,非重叠套接字忽略该参数;

  • 相关阅读:
    捡到一本<C++ Reference>
    题目1008:最短路径问题
    题目1014:排名
    题目1080:进制转换
    题目1081:递推数列
    题目1086:最小花费
    题目1076:N的阶乘
    题目1035:找出直系亲属
    在Mac上搭建Jenkins环境
    获取鼠标点击UGUI,先对于特定物体的相对坐标
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/6919301.html
Copyright © 2020-2023  润新知