第十章 支持例程
10.1 启动与清除
每一个WinSock应用程序必须在开始操作前初始化WinSock的动态链接库(DLL),并在操作完成后通知DLL进行清除操作。WinSock应用程序在开始时必须调用WSAStartup()函数,结束时必须调用WSACleanup()函数。可以多次调用这两个函数,但是必须保证它们是成对出现的。
在系统内部,WSAStartup()函数从0开始增加引用计数量,而WSACleanup()函数减少引用计数量。当引用计数量减为0时,WinSock DLL才释放资源。
10.1.1 WSAStartup()
WSAStartup()函数必须是WinSock应用程序使用的第一个WinSock函数。否则,其他的WinSock API函数都将会失败并返回错误值WSAENOTNITIALISED。WinSock DLL使用这个函数来注册调用任务并分配必要的资源。
下面是WSAStartup()函数的原型:
int WSAAPI WSAStartup(
WORD wVersionRequired, //hightest version of WinSock API
LPWSADATA lpWSAData //ptr to struct to receive details on Windows Sockets implementation
);
wVersionRequired:应用程序要求的主要和次要的版本号。LSB是主要的版本号,MSB是次要的版本号。
lpWSAData:指向WinSock应用程序提供的缓存区,缓存区中填入的内容为有关WinSock实现的特有信息。
这个函数与其它很多函数有所不同,它在成功时返回0值,返回错误值表示失败。函数的每次成功调用,都将会使引用计数增加1.
typedef struct WSAData {
WORD wVersion; //version app expected to use
WORD wHighVersion; //hightest version available
#ifdef _WIN64
unsigned short iMaxSockets; //max sockets available
unsigned short iMaxUdpDg; // max datagram size
char FAR * lpVendorInfo; //no format
char szDescription[WSADESCRIPTION_LEN+1];//no format
char szSystemStatus[WSASYS_STATUS_LEN+1];//no format
#else
char szDescription[WSADESCRIPTION_LEN+1];//no format
char szSystemStatus[WSASYS_STATUS_LEN+1];//no format