1.2.2 开发准备(1)
在具体实现本实例之前,需要掌握一些与本实例有关的基础知识。
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地址
|
网络类别< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
最大网络数 |
第一个可
用的网络号 |
最后一个可
用的网络号 |
每个网络中的
最大主机数 |
|
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调用以前把所需的信息拷贝下来。