0a103 服务器打算监听接入客户机请求时,也必须指定一个IP地址和一个端口号。 Winsock中,应用 通过 SOCKADDR IN结构来指定P地址和服务端口信息,该结构的格式如下: struct sockaddr in sin_family sin_port struct in addr sin add sin family字段必须设为 AF INET,以告知 Winsock我们此时正在使用IP地址家族。 P协议第6版 IP协议第6版对原来的IP协议规格进行了改进,将IP地址扩展到16个字节。随着 IPv4 的退场,不久的将来,IPV6的地位显得越来越重要。许多 Winsock头文件中都包含针对 IPv6结构的条件定义:但是当前的win32平台均没有提供IPv6网络堆栈(包括 Windows 2000在内)。“微软研究部”已开发出一个试验性的IPv6堆栈,可从htp:// research microsoft. com/ stripy6/下载;然而,该堆栈未获支持,而且我们不打算深入第6版协议中 专有的特性。 准备使用哪个TCP或UDP通信端口来标识服务器服务这一问题,则由sin_port字段定义 在选择端口时,应用必须特别小心,因为有些可用端口号是为“已知的”(即固定的)服务保 留的(比如说文件传输协议和超文本传输协议,即FTP和HTTP)。“已知的协议”,即固定协 议,采用的端口由“互联网编号分配认证(IANA)”控制和分配,RFC1700中说明编号。从 本质上说,端口号分为下面这三类:“已知”端口、已注册端口、动态和(或)私用端口 ■0~1023由IANA控制,是为固定服务保留的。 ■1024~49151是IANA列出来的、已注册的端口,供普通用户的普通用户进程或程序使 ■49152~65535是动态和(或)私用端口。 普通用户应用应该选择1024-49151之间的已注册端口,从而避免端口号已被另一个应用 或系统服务所用。此外,49152-65535之间的端口可自由使用,因为IANA这些端口上没有注 册服务。在使用 bind Apll函数时,如果一个应用和主机上的另一个应用采用的端口号绑定在 起,系统就会返回 Winsock错误 WSAEADDRINUSE。第7章将深入阐述 Winsock绑定进程」 SOCKADDR IN结构的 sin addr字段用于把一个IP地址保存为一个4字节的数,它是无符 号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程IP地址。IP地址一般是 用“互联网标准点分表示法”(像a.bcd一样)指定的,每个字母代表一个字节数,从左到右 分配一个4字节的无符号长整数。最后一个字段sin_zero,只充当填充项的职责,以使 SOCKADDR IN结构和 SOCKADDR结构的长度一样 个有用的、名为 inet addr的支持函数,可把一个点式IP地址转换成一个32位的无符号 长整数。它的定义如下 unsigned long inet_addr( const char FARcp第6章计地址家族和名字解析计计103 下载 服务器打算监听接入客户机请求时,也必须指定一个 I P地址和一个端口号。Wi n s o c k中,应用 通过S O C K A D D R _ I N结构来指定I P地址和服务端口信息,该结构的格式如下: s i n _ f a m i l y字段必须设为A F _ I N E T,以告知Wi n s o c k我们此时正在使用I P地址家族。 IP协议第6版 I P协议第6版对原来的 I P协议规格进行了改进,将 I P地址扩展到1 6个字节。随着 I P v 4 的退场,不久的将来, I P v 6的地位显得越来越重要。许多 Wi n s o c k头文件中都包含针对 I P v 6结构的条件定义;但是当前的 Wi n 3 2平台均没有提供 I P v 6网络堆栈(包括 Wi n d o w s 2 0 0 0在内)。“微软研究部”已开发出一个试验性的 I P v 6堆栈,可从 h t t p : / / r e s e a r c h . m i c r o s o f t . c o m / m s t r i p v 6 /下载;然而,该堆栈未获支持,而且我们不打算深入第 6版协议中 专有的特性。 准备使用哪个 T C P或U D P通信端口来标识服务器服务这一问题,则由 s i n _ p o r t字段定义。 在选择端口时,应用必须特别小心,因为有些可用端口号是为“已知的”(即固定的)服务保 留的(比如说文件传输协议和超文本传输协议,即 F T P和H T T P)。“已知的协议”,即固定协 议,采用的端口由“互联网编号分配认证( I A N A)”控制和分配,RFC 1700中说明编号。从 本质上说,端口号分为下面这三类:“已知”端口、已注册端口、动态和(或)私用端口。 ■ 0 ~ 1 0 2 3由I A N A控制,是为固定服务保留的。 ■ 1 0 2 4 ~ 4 9 1 5 1是I A N A列出来的、已注册的端口,供普通用户的普通用户进程或程序使 用。 ■ 4 9 1 5 2 ~ 6 5 5 3 5是动态和(或)私用端口。 普通用户应用应该选择 1 0 2 4 ~ 4 9 1 5 1之间的已注册端口,从而避免端口号已被另一个应用 或系统服务所用。此外, 4 9 1 5 2 ~ 6 5 5 3 5之间的端口可自由使用,因为 I A N A这些端口上没有注 册服务。在使用bind API函数时,如果一个应用和主机上的另一个应用采用的端口号绑定在一 起,系统就会返回Wi n s o c k错误W S A E A D D R I N U S E。第7章将深入阐述Wi n s o c k绑定进程。 S O C K A D D R _ I N结构的s i n _ a d d r字段用于把一个 I P地址保存为一个 4字节的数,它是无符 号长整数类型。根据这个字段的不同用法,还可表示一个本地或远程 I P地址。I P地址一般是 用“互联网标准点分表示法”(像a . b . c . d一样)指定的,每个字母代表一个字节数,从左到右 分配一个 4字节的无符号长整数。最后一个字段 sin_ zero ,只充当填充项的职责,以使 S O C K A D D R _ I N结构和S O C K A D D R结构的长度一样。 一个有用的、名为 i n e t _ a d d r的支持函数,可把一个点式 I P地址转换成一个 3 2位的无符号 长整数。它的定义如下: unsigned long inet_addr( const char FAR *cp );