首页 > 代码库 > 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的定义格式如下:
- int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested:是一个WORD(双字节)数值,它指定了应用程序需要使用的Winsock版本,主版本号在低字节,次版本号在高字节。
lpWSAData:指向WSADATA数据结构的指针,该结构用于返回本机的Winsock系统实现的信息。该结构中WhighVersion和wVersion两个域,前者是系统支持的最高版本,后者是系统希望调用者使用的版本。
如果函数执行成功则返回0,否则返回错误码。如果ws2_32.dll尚未初始化,则无法调用WSAGetLastError。
(2) WSAGetLastError
函数WSAGetLastError的定义格式如下。
- int WSAGetLastError(void);
本函数返回上次发生的网络错误。当一特定的Windows Sockets API函数指出一个错误已经发生时,本函数就应被调用来获得对应的错误代码。
在一个非占先的Windows环境下,WSAGetLastError()只用来获得Windows Sockets API错误。在占先环境下,WSAGetLastError()将调用GetLastError()来获得所有在每线程基础上的Win32 API函数的错误状态。为了提高可移植性,应用程序应在调用失败后应立即使用WSAGetLastError()。
1.2.2 开发准备