由于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 *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
);
《Windows API巡礼》---WSAStartup和WSACleanup
原创wx5dce75f541ce3 博主文章分类:Windows API巡礼 ©著作权
©著作权归作者所有:来自51CTO博客作者wx5dce75f541ce3的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
常用的虚拟终端和Windows X Server
记录一下常用的虚拟终端和X Server
虚拟终端 XServer SSH -
《Windows API巡礼》---StringCbCopy和StringCchCopy
StringCbCopy函数用于拷贝string,且提供了目标缓冲区的大小作为参数,防止缓冲区溢出等安全问题。这个函数可用于替换以下
windows api character null path -
《Windows API巡礼》---GetEnvironmentStrings和GetEnvironmentVariable
<br />环境变量是进程中一组变量信息,环境变量分为系统环境变量、用户环境变量和进程环境变量。系统有全局的环境变量,在进
api windows null winapi system -
《Windows API巡礼》---sendto和recvfrom
,指向存储目标套接字地址信息的so
windows api socket structure struct -
《Windows API巡礼》---send和recv
<br />send函数用于在一个已经连接成功的socket上发送数据:<br />int send(<br /> __in SOCKET s, //已连接的套接字<br />
windows api socket structure server -
《Windows API巡礼》---socket和bind
<br />函数socket()可以创建一个socket对象:<br />SOCKET WSAAPI socket(<br /> __in int af, //协议的地址家族,在Win
windows api socket struct stream -
《Windows API巡礼》---VirtualAlloc和VirtualFree
<br />进程的虚拟地址空间内存页面存在三种状态,分别是空闲的free、保留的reserved和提交的committed。多数情况
windows api exception winapi null