首页 > 代码库 > 1.2.2 开发准备

1.2.2 开发准备

在具体实现本实例之前,需要掌握一些与本实例有关的基础知识。

1. IP基础

所谓IP地址,就是给每个连接在Internet上的主机分配的一个32bit的地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。

例如一个采用二进制形式的IP地址是"00001010000000000000000000000001",这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用句点符号"."分开不同的字节。于是,上面的IP地址可以表示为"10.0.0.1"。IP地址的这种表示法叫做"点分十进制表示法",这显然比1和0容易记忆得多。

Internet上的每台主机(Host) 都有一个唯一的IP地址。IP协议就是使用这个地址在主机之间传递信息,这是Internet能够运行的基础。IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开,例如 159.226.1.1。

IP地址由两部分组成,一部分为网络地址,另一部分为主机地址。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A~E类。其中A、B、C类(见表1-4)由Internet NIC在全球范围内统一分配,D、E类为特殊地址。

表1-4  常用的A、B、C类IP地址

网络类别

最大网络数

第一个可

用的网络号

最后一个可

用的网络号

每个网络中的

最大主机数

A

126

1

126

16777214

B

16382

128.1

191.254

65534

C

2097150

192.0.1

223.255.254

254

2. Winsock数据库查询函数

通过使用Winsock数据库查询函数,可以非常方便地获取某计算机的地址、名字和端口号。本实例是基于Winsock数据库查询函数实现的,接下来将简单介绍Winsock中数据库查询函数的基本知识。

Windows Sockets规范定义了如下数据库例程。

gethostbyaddr():从网络地址得到对应的名字(可能有多个)和地址,在某些情况下可能会阻塞。

gethostbyname():从主机名得到对应的名字(可能有多个)和地址,在某些情况下可能会阻塞。

gethostname():得到本地主机名,在某些情况下可能会阻塞。

getprotbyname():从协议名得到对应的协议名和数值,在某些情况下可能会阻塞。

getservbyname():从一个服务的名字得到对应的服务名以及端口号,在某些情况下可能会阻塞。

getservbyport():从一个端口号得到对应的服务名以及端口号,在某些情况下可能会阻塞。

正如我们先前提出的,Windows Sockets提供者有可能不采用依赖于本地数据库的方式来实现这些函数。某些数据库例程返回的指针(例如gethostbyname())指向的区域是由Windows Sockets函数库分配的。这些指针指向的数据是易失的。它们只在该线程的下一个Windows Sockets API调用前有效。此外,应用程序不应试图修改这个结构,或者释放其中的任何一部分。在一个线程中,这个结构只有一份拷贝。因此,应用程序应该在发出下一个Windows Sockets API调用以前把所需的信息拷贝下来。

1.2.2  开发准备(2)

3. Winsock库函数

在本实例中,还需要使用Winsock库函数实现注册、注销以及错误处理。接下来将简单讲解两个最为常用的Winsock库函数的基本知识。

(1) WSAStartup

在使用Winsock库函数之前,必须先调用函数WSAStartup,该函数负责初始化动态链接库Ws2_32.dll。

函数WSAStartup的定义格式如下:

  1. int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 

wVersionRequested:是一个WORD(双字节)数值,它指定了应用程序需要使用的Winsock版本,主版本号在低字节,次版本号在高字节。

lpWSAData:指向WSADATA数据结构的指针,该结构用于返回本机的Winsock系统实现的信息。该结构中WhighVersion和wVersion两个域,前者是系统支持的最高版本,后者是系统希望调用者使用的版本。

如果函数执行成功则返回0,否则返回错误码。如果ws2_32.dll尚未初始化,则无法调用WSAGetLastError。

(2) WSAGetLastError

函数WSAGetLastError的定义格式如下。

  1. int WSAGetLastError(void); 

本函数返回上次发生的网络错误。当一特定的Windows Sockets API函数指出一个错误已经发生时,本函数就应被调用来获得对应的错误代码。

在一个非占先的Windows环境下,WSAGetLastError()只用来获得Windows Sockets API错误。在占先环境下,WSAGetLastError()将调用GetLastError()来获得所有在每线程基础上的Win32 API函数的错误状态。为了提高可移植性,应用程序应在调用失败后应立即使用WSAGetLastError()。

1.2.2 开发准备