[Visual Studio C++][Socket编程] WSAStartup()函数使用讲解

 

一.前言        

        当我们进行socket编程时,要调用各种socket函数,而且还需要用到一个库文件 Ws2_32.lib 和一个头文件 Winsock2.h。

二.讲解

     1.函数的功能

  • WSAStartup()函数 

        int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ); 

        wsastartup()函数向操作系统说明,我们要用哪个库文件。 因此就可以将库文件与当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了。 一句话解释:wsastartup()主要就是进行相应的socket库绑定。

       使用Socket的程序在使用Socket之前必须调用WSAStartup函数。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。 

  • WSACleanup()函数 

        int WSACleanup (void); 

        应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

     2.函数使用     

        1).WSAStartup( )

     ①原型:

   int   PASCAL   FAR  WSAStartup ( WORD  wVersionRequested, LPWSADATA   lpWSAData );

     ②参数:

  1. wVersionRequested 是Windows Sockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号。
  2. lpWSAData 是指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。

     ③.举例

               1.)假如一个程序要使用2.1版本的Socket,那么程序代码如下 

wVersionRequested = MAKEWORD( 2, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData );

                2).

err = WSAStartup(0x0202, &wsaData);

        2).WSACleanup()

      ①.原型:

   int WSACleanup (void); 

三.扩展

     1.WSADATA数据类型

        1)功能

                    这个结构被用来存储。被WSAStartup函数调用后返回的 Windows Sockets数据。它包含Winsock.dll执行的数据。

   2)结构原型  

struct WSAData 
{

  WORD wVersion;

  WORD wHighVersion;

  char szDescription[WSADESCRIPTION_LEN+1];

  char szSystemStatus[WSASYSSTATUS_LEN+1];

  unsigned short iMaxSockets;

  unsigned short iMaxUdpDg;

  char *lpVendorInfo;
};

  WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息。

  3)成员

  1. wVersion 
                     Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号, 低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)
     
  2. wHighVersion
                     这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。
     
  3. szDescription
                     以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。
     
  4. szSystemStatus
                     以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。
     
  5. iMaxSockets
                     单个进程能够打开的socket的最大数目。Windows Sockets的实现能提供一个全局的socket池,可以为任何进程分配;或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如,X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值:如果这个值小于8,应用程序将显示一条错误信息,指示用户重新配置网络软件(这是一种可能要使用szSystemStatus文本的场合)。显然无法保证某个应用程序能够真正分配iMaxSockets个socket,因为可能有其它WindowsSockets应用程序正在使用。
     
  6. iMaxUdpDg
                    Windows Sockets应用程序能够发送或接收的最大的用户数据包协议(UDP)的数据包大小,以字节为单位。如果实现方式没有限制,那么iMaxUdpDg为零。在Berkeley sockets的许多实现中,对于UDP数据包有个固有的限制(在必要时被分解),大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现,iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么,都不推荐你发回一个比网络的最大传送单元(MTU)还大的广播数据包。(Windows Sockets API 没有提供发现MTU的机制,但是它不会小于512个字节)。WinSock2.0版中已被废弃。
     
  7. lpVendorInfo 
                    指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。WinSock2.0版中已被废弃。

猜你喜欢

转载自blog.csdn.net/Robot_Starscream/article/details/83039935
今日推荐