实验一 Winsock 编程接口实验
1 实验类型
验证型实验
2 实验目的
1. 掌握Winsock 的启动和初始化;
2. 掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
3 背景知识
(1)Winsock 基本概念
Winsock 即Windows Sockets 的简称,是在Windows 操作系统平台下使用的套接字接口。
自Winsock2 规范开始,Windows Sockets 就成为了一个得到广泛应用的、开放的、支持多种
协议的网络编程接口。它是一个与协议无关的传送接口,可以用该接口来调用大多数网络协
议,而不需要知道这些协议具体的实现细节。
Win32 平台下的Winsock 编程接口支持的协议包括:IP、IPX/SPX、NetBIOS、AppleTalk、
ATM 等,这些协议具有相当大的差异,例如它们支持不同范围的网络、不同的寻址方式、
不同的传输介质等,但它们的调用操作大多数是相同的。因此,定义统一的Winsock 编程接
口,有利于实现采用统一的方法对实现对不同协议的调用,简化网络程序设计过程。
Winsock编程接口的实质是一套AP(I Application Programming Interface,应用编程接口),
称为Winsock API,由一系列函数构成。在编写网络程序的时候,经常需要跟这些函数打交
道,通过对这些函数的调用,实现对具体网络协议的控制,达到实现网络事务的目的。
(2)Winsock 的启动和终止
由于Winsock 的服务是以动态链接库Winsock DLL(在Windows 安装目录下的system32
下,假如Windows 安装在C:\WINNT 目录下,则在C:\WINNT\ system32 目录下可以找到
winsock.dll)形式实现的,因此必须先调用WSAStartup 函数实现对Winsock DLL 的初始化,
协商Winsock 的版本,并分配必要的资源。
WSAStartup 函数原型为:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
其中,参数wVersionRequested 用于指定准备加载的Winsock 库的版本;通常的做法是
高位字节指定所需要的Winsock 库的副版本,低位字节指定所需要的Winsock 库的主版本,
后,再用宏MAKEWORD(X,Y)(X 是低位字节,Y 是高位字节)获得wVersionRequested
的正确值。
lpWSAData 参数是指向LPWSADATA 结构的指针,该结构包含了加载的库版本的有关
信息,具体格式如下:
Typedef struct WSAData{
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
}WSADATA, *LPWSADATA;
其中,wVersion 字段为希望使用的Winsock 版本。字段wHighVersion 返回现有Winsock
库的最高版本。szDescription 和szSystemStatus 这两个字段由特定的Winsock 实施方案设定,
事实上没有使用。字段iMaxSockets 和iMaxUdpDg 分别为可同时打开的套接字数和数据报
的最大长度,一般不要使用它们,若想知道数据报的最大长度则应该通过WSAEnumProtocols
函数来查询协议信息,而可同时打开套接字的最大数目是不固定的,它很大程度上和可用物
理内存的数量有关。最后一个字段lpVendorInfo 是为厂商预留的,任何一个Win32 平台都没
有使用这个字段。
此外,在应用程序关闭套接字后,还应调用WSACleanup 函数终止对Winsock DLL 的使
用,并释放资源,以备下次使用。
WSACleanup 函数的原型如下:
int WSACleanup(void);
该函数不带任何参数,若调用成功则返回0ÿ