`

《Windows API巡礼》---WSAStartup和WSACleanup

 
阅读更多

由于Winsock在被调用时是以动态链接库Winsock.dll的形式实现的,所以在它初始化时应首先调用WSAStartup函数,对Winsock DLL进行初始化,确定被调用的Winsock的版本号,并以此分配必要的资源:

int WSAStartup(

__in WORD wVersionRequested, //用于存储要加载的Winsock库的版本;一般高位字节用于存储

//Winsock库的副版本,而低位字节则用来存储主版本,

//使用MAKEWORD(X, Y)构造一个完整的版本信息

__out LPWSADATA lpWSAData //指向WSAData结构的指针,该结构包含了加载库版本的相关信息

);

返回值:

成功时,返回0

失败时,直接返回错误码,不用也不能再调用WSAGetLastError()函数

typedef struct WSAData {

WORD wVersion; //当前使用的版本信息

WORD wHighVersion; //Winsock库最高版本号

char szDescription[WSADESCRIPTION_LEN+1]; //闲置不用

char szSystemStatus[WSASYS_STATUS_LEN+1]; //闲置不用

unsigned short iMaxSockets; //同时打开的套接字个数

unsigned short iMaxUdpDg; //数据包最大长度

char FAR *lpVendorInfo; //为指定厂商信息预留

} WSADATA, *LPWSADATA;

WSACleanup函数用于终止对Winsock DLL的使用,并释放资源:

int WSACleanup(void);

返回值:

成功时,返回0

失败时,返回SOCKET_ERROR,调用WSAGetLastError函数可查看进一步错误信息。

在多线程环境中,WSACleanup终止所有线程的socket操作。

实例代码如下:

#pragma comment(lib, "wininet.lib")

#include <winsock2.h>

#include <ws2tcpip.h>

#include <stdio.h>

#include <windows.h>

int __cdecl main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */

wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0) {

/* Tell the user that we could not find a usable */

/* Winsock DLL. */

printf("WSAStartup failed with error: %d/n", err);

return 1;

}

/* Confirm that the WinSock DLL supports 2.2.*/

/* Note that if the DLL supports versions greater */

/* than 2.2 in addition to 2.2, it will still return */

/* 2.2 in wVersion since that is the version we */

/* requested. */

if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {

/* Tell the user that we could not find a usable */

/* WinSock DLL. */

printf("Could not find a usable version of Winsock.dll/n");

WSACleanup();

return 1;

}

else

printf("The Winsock 2.2 dll was found okay/n");

/* The Winsock DLL is acceptable. Proceed to use it. */

/* Add network programming using Winsock here */

/* then call WSACleanup when down using the Winsock dll */

WSACleanup();

}

附:

MAKEWORD宏用于拼接两个指定的BYTE值,得到一个WORD值:

WORD MAKEWORD(

BYTE bLow, //新值的低位字节

BYTE bHigh //新值的高位字节

);

返回值是一个WORD值。

LOBYTE宏用于从指定的WORD值获取其低位字节:

BYTE LOBYTE(

WORD wValue

);

HIBYTE宏用于从指定的WORD值获取其高位字节:

BYTE HIBYTE(

WORD wValue

);

分享到:
评论

相关推荐

    获取ip源程序

    //检测windows api 版本号 WORD wVerdionRequested; wVerdionRequested=MAKEWORD(2,0); WSADATA wsaData; int err; err=WSAStartup(wVerdionRequested,&wsaData;); if(err!=0) return; //对winsock api ...

    易语言API的Ping代码

    易语言API的Ping代码源码,API的Ping代码,test,Ping,指针到整数_,API_IcmpCloseHandle,API_IcmpCreateFile,inet_addr,API_IcmpSendEcho,API_GlobalSize,API_gethostbyname,API_WSAStartup,WSACleanup,API_CopyMemory,...

    WSAStartup函数

    WSAStartup函数;

    易语言网络通信API

    易语言网络通信API源码,网络通信API,取主机名,转换为主机名,转换为IP地址,通信测试,GetNetworkParams,LocalAlloc,LocalFree,WSAStartup,WSACleanup,inet_addr,gethostbyaddr,CopyMemory_int2hostent,gethostbyname,...

    socket编写windows和linux通讯程序-源码

    利用socket编写windows和linux通讯程序(源代码实现) &lt;br&gt; socket编程大家都很熟悉,我在这里就不再罗嗦了。直接切入正题。该程序分两部分,server端和client端(谁都知道)。其中server端采用windows平台,那...

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    精通Windows Sockets网络开发——基于Visual C++实现 目 录 第1篇网络开发基础篇 第1章准备开发环境 1.1windows sockets开发概述 1.1.1网络程序开发应用 1.1.2网络程序结构——c/s、b/s 1.1.3网络程序通信基础——...

    Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,part1

    对WindowsSockets规范进行了深刻地解读,系统讲解了WindowsSockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是学习WindowsSockets...

    基于Visual C++的Winsock API研究

     此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程式中调用该函数的形式如下:WSAStartup((WORD)((1|1),(LPWSADATA)&...

    易语言WS2_32的HTTP模块

    易语言WS2_32的HTTP模块源码,WS2_32的HTTP模块,API_WSAStartup,API_WSACleanup,API_WSAGetLastError,API_connect,API_closesocket,API_socket,API_inet_addr,API_gethostbyname,API_htons,API_send,API_recv,...

    易语言取WinSock程序

    取WinSock程序,子程序1,取十六进制,取注册表,转换Unicode转Ansi,API_StringFromGUID2,API_LocalAlloc,API_LocalFree,API_WSAStartup,API_memmove,API_CopyMemory,API_取环境变量值,API_WSACleanup,API_...

    Windows网络编程

    Windows网络编程— Windows网络编程(基础篇1) Winsock是一种网络编程接口,不是协议。 除了WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError

    Windows Sockets网络编程 总计4个包,part2

    对WindowsSockets规范进行了深刻地解读,系统讲解了WindowsSockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是学习WindowsSockets...

    API实现ping测试源码通信测试_API测试

    通信测试_,IcmpCreateFile,IcmpCloseHandle,IcmpSendEcho,WSAGetLastError,WSAStartup,WSACleanup,gethostname,gethostbyname,GetHost,GetVaradd,GetAddr,inet_addr,GetTypeSize,inet_ntoa,GetTickCount,...

    易语言网络API取本机名

    易语言网络API取本机名源码,网络API取本机名,取本机IP,gethostname,WSAGetLastError,WSAStartup,gethostbyname,RtlMoveMemory_字节型,RtlMoveMemory_HOSTENT,RtlMoveMemory_整数

    MAC/网卡IP地址获取 Delphi程序.rar

    通过调用Api函数gethostname,gethostbyname,wsastartup,uses中加winsock,介绍wsadata,phostent,msdn,另外gethostaddress。  function NBGetAdapterAddress(a: integer): String;  a指定多个网卡适配器中的哪...

Global site tag (gtag.js) - Google Analytics