c++中Socket通信函数之WSAStartup


  • socket通信的整个过程:

     

    \
     

    WSAStartup
    此函数在应用程序中初始化winsockDLL

    int WSAStartup(

           __in      WORD wVersionRequested,

           __out      LPWSADATA lpWSAData

           );

    wVersionRequested

           调用程序使用windows socket的最高版本。 高字节指定小的版本号,低字节指定高的版本号。

    lpWSAData

           指向WSADATA数据结构体指针,接收Windows Socket的实现细节。

     

    返回值

           如果成功,WSAStartup函数返回0。否则,返回下面列表显示的错误码之一。

           WSAStartup函数直接在返回值中返回扩展的错误码,不再需要调用WSAGetLastError函数。

     

    错误码

    解释

    WSASYSNOTREADY

    网络通信中下层的网络子系统没准备好

    WSAVERNOTSUPPORTED

    Socket实现提供版本和socket需要的版本不符

    WSAEINPROGRESS

    一个阻塞的Socket操作正在进行

    WSAEPROCLIM

    Socket的实现超过Socket支持的任务数限制

    WSAEFAULT

    lpWSAData参数不是一个合法的指针


    说明

    使用Socket之前必须调用WSAStartup函数,此函数在应用程序中用来初始化Windows Sockets DLL,只有此函数调用成功后,应用程序才可以调用Windows SocketsDLL中的其他API函数,否则后面的任何函数都将调用失败。

           为了支持日后各种不同功能winsock实现和应用,在WSAStartup函数中做了协商。WSAStartup函数的调用方和Windows Sockets DLL互相通知对方它们可以支持的最高版本。并且互相确认对方的最高版本是可接受的。

    在WSAStartup函数的入口,Windows Sockets DLL检查了应用程序所需的版本.如果版本高于DLL支持的最低版本,则调用成功并且DLL在wHighVersion中返回它所支持的最高版本,在wVersion中返回它的高版本和wVersionRequested中的较小者,然后Windows Sockets DLL就会假设应用程序将使用wVersion。如果WSDATA结构中的wVersion域对调用方来说不可接收, 它就应调用WSACleanup函数并且要么去另一个Windows Sockets DLL中搜索,要么初始化失败。

     

    一旦一个应用或者DLL成功调用WSAStartup函数,应用程序才可以处理其他的winsock 中的其他函数。当应用或者DLL调用Winsock DLL服务完成,必须调用WSACleanup函数,此函数让Winsock DLL释放应用用到的Winsock资源。

    应用可以调用WSAStartup不止一次,如果它需要获得WSADATA结构体信息不止一次。在每次调用时,应用可以指定任何winsock DLL支持的版本数。

    WSAStartup函数通常导致具体协议帮助DLL一直加载,因此,WSAStartup函数不能被一个DLL应用的DLLMain函数调用。这样可能导致死锁的发生。

    应用必须调用WSAClearup函数在每次成功调用WSAStartup函数。这就意味着,例如应用调用WSAStartup函数三次,它也需要调用WSAClearup函数三次。前两次调用WSAClearup函数除了减少内部计数器什么都不做,最后一个次调用WSAClearup函数则释放任务使用的需要的资源。

    例子

     

    001. #defineWIN32_LEAN_AND_MEAN
    002.  
    003.  
    004.  
    005. #include<windows.h>
    006.  
    007. #include<winsock2.h>
    008.  
    009. #include<ws2tcpip.h>
    010.  
    011. #include<stdio.h>
    012.  
    013.  
    014.  
    015. //链接  Ws2_32.lib
    016.  
    017. #pragmacomment(lib, "ws2_32.lib")
    018.  
    019.  
    020.  
    021.  
    022.  
    023. int __cdeclmain()
    024.  
    025. {
    026.  
    027.  
    028.  
    029. WORD wVersionRequested;
    030.  
    031. WSADATA wsaData;
    032.  
    033. int err;
    034.  
    035.  
    036.  
    037. /* 使用Windef.h中的 MAKEWORD(lowbyte, highbyte) 宏定义 */
    038.  
    039. wVersionRequested = MAKEWORD(2, 2);
    040.  
    041.  
    042.  
    043. err = WSAStartup(wVersionRequested,&wsaData);
    044.  
    045. if (err != 0) {
    046.  
    047. /* 找不到Winsock DL L.*/
    048.  
    049. printf("WSAStartup failed witherror: %d\n", err);
    050.  
    051. return 1;
    052.  
    053. }
    054.  
    055.  
    056.  
    057. /*确保 WinSock DLL 支持 2.2.*/
    058.  
    059. /* Note that ifthe DLL supports versions greater    */
    060.  
    061. /* than 2.2 inaddition to 2.2, it will still return */
    062.  
    063. /* 2.2 inwVersion since that is the version we     */
    064.  
    065. /*requested.                                        */
    066.  
    067.  
    068.  
    069. if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2) {
    070.  
    071. /* Tell the user that we could not finda usable */
    072.  
    073. /* WinSock DLL.                                  */
    074.  
    075. printf("Could not find a usableversion of Winsock.dll\n");
    076.  
    077. WSACleanup();
    078.  
    079. return 1;
    080.  
    081. }
    082.  
    083. else
    084.  
    085. printf("The Winsock 2.2 dll wasfound okay\n");
    086.  
    087.  
    088.  
    089.  
    090.  
    091. /* The WinsockDLL is acceptable. Proceed to use it. */
    092.  
    093.  
    094.  
    095. /* Add networkprogramming using Winsock here */
    096.  
    097.  
    098.  
    099. /* then callWSACleanup when done using the Winsock dll */
    100.  
    101.  
    102.  
    103. WSACleanup();
    104.  
    105.  
    106.  
    107. }

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值