JavaScript is required to for searching.
跳过导航链接
退出打印视图
编程接口指南     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  内存和 CPU 管理

2.  用于 Solaris Cluster 的远程共享内存 API

3.  会话描述协议 API

4.  进程调度程序

5.  地址组 API

6.  输入/输出接口

7.  进程间通信

8.  套接字接口

9.  使用 XTI 和 TLI 编程

10.  包过滤钩子

11.  传输选择和名称到地址映射

传输选择

名称到地址映射

straddr.so

使用名称到地址映射例程

12.  实时编程和管理

13.  Solaris ABI 和 ABI 工具

A.  UNIX 域套接字

索引

名称到地址映射

通过名称到地址映射,应用程序可以获取指定主机上某一服务的地址,而不管使用何种传输。名称到地址映射包含以下接口:

netdir_getbyname(3NSL)

将主机名和服务名映射为一组地址

netdir_getbyaddr(3NSL)

将地址映射为主机名和服务名

netdir_free(3NSL)

释放由名称到地址的转换例程所分配的结构

taddr2uaddr(3NSL)

转换一个地址,并返回该地址与传输无关的字符表示形式

uaddr2taddr(3NSL)

将通用地址转换为 netbuf 结构

netdir_options(3NSL)

特定于传输的功能(如 TCP 和 UDP 的广播地址和保留端口功能)的接口

netdir_perror(3NSL)

stderr 中显示一条消息,说明用来将名称映射到地址的例程之一失败的原因。

netdir_sperror(3NSL)

返回一个字符串,其中包含的错误消息说明了用来将名称映射到地址的例程之一失败的原因。

每个例程的第一个参数均指向用于描述传输的 netconfig(4) 结构。例程使用 netconfig(4) 结构中的目录查找库路径数组来调用每个路径,直到转换成功为止。

表 11-1 介绍了名称到地址库。使用名称到地址映射例程中介绍的例程在 netdir(3NSL) 手册页中进行了定义。


注 - Solaris 环境中不再存在以下库:tcpip.soswitch.sonis.so。有关此更改的更多信息,请参见 nsswitch.conf(4) 手册页以及 gethostbyname(3NSL) 手册页中的“附注”部分。


表 11-1 名称到地址库

传输系列
说明
-
inet
针对协议系列 inet 的网络的名称到地址映射由名称服务转换基于文件 nsswitch.conf(4) 中对应于 hostsservices 的项提供。对于其他系列的网络,短划线表示无法正常使用的名称到地址映射。
straddr.so
loopback
包含在接受字符串作为地址的任何协议中执行名称到地址映射的例程,如回送传输。

straddr.so

straddr.so 库的名称到地址转换文件由系统管理员创建。系统管理员还将维护这些转换文件。straddr.so 文件包括 /etc/net/transport-name/hosts/etc/net/transport-name/servicestransport-name 是指接受字符串地址的传输的本地名称,该名称在 /etc/netconfig 文件的 network ID 字段中指定。例如,ticlts 的主机文件可以是 /etc/net/ticlts/hoststiclts 的服务文件可以是 /etc/net/ticlts/services

大多数字符串地址不区分 hostservice。不过,将字符串分隔为主机部分和服务部分这一点与其他传输是一致的。/etc/net/transport-name/hosts 文件包含一个文本字符串,该字符串会假定为主机地址,后跟主机名:

joyluckaddr

joyluck

carpediemaddr

carpediem

thehopaddr

thehop

pongoaddr

pongo

由于回送传输的范围不能超出包含主机,因此列出其他主机毫无意义。

/etc/net/transport-name/services 文件包含后跟标识服务地址的字符串的服务名:

rpcbind    rpc
listen    serve

例程可通过串联主机地址、句点 (.) 和服务地址来创建全字符串地址。例如,pongo 上的 listen 服务的地址为 pongoaddr.serve

应用程序请求某个传输上使用该库的特定主机中服务的地址时,/etc/net/transport/hosts 中必须包含主机名。/etc/net/transport/services 中必须包含服务名。如果缺少任一名称,则名称到地址的转换将失败。

使用名称到地址映射例程

本节概述了可供使用的映射例程。这些例程会返回网络名称或将其转换为各自的网络地址。请注意,netdir_getbyname(3NSL)netdir_getbyaddr(3NSL)taddr2uaddr(3NSL) 可返回指向必须通过 netdir_free(3NSL) 调用来释放的数据的指针。

    int netdir_getbyname(struct netconfig *nconf, 
            struct nd_hostserv *service, struct nd_addrlist **addrs);

netdir_getbyname(3NSL) 可将 service 中指定的主机名和服务名映射为一组与 nconf 中标识的传输一致的地址。nd_hostservnd_addrlist 结构在 netdir(3NSL) 手册页中进行了定义。addrs 中会返回指向上述地址的指针。

要查找所有可用传输上的主机和服务的所有地址,请使用由 getnetpath(3NSL)getnetconfig(3NSL) 返回的每个 netconfig(4) 结构来调用 netdir_getbyname(3NSL)

int netdir_getbyaddr(struct netconfig *nconf,
        struct nd_hostservlist **service, struct netbuf *netaddr);

netdir_getbyaddr(3NSL) 可将地址映射为主机名和服务名。此接口使用 netaddr 中的地址进行调用,并会返回 service 中主机名和服务名对的列表。nd_hostservlist 结构在 netdir(3NSL) 中进行了定义。

void netdir_free(void *ptr, int struct_type);

netdir_free(3NSL) 例程会释放名称到地址转换例程所分配的结构。其中的参数可以使用下表显示的值。

表 11-2 netdir_free(3NSL) 例程

struct_type
ptr
ND_HOSTSERV
指向 nd_hostserv 结构的指针
ND_HOSTSERVLIST
指向 nd_hostservlist 结构的指针
ND_ADDR
指向 netbuf 结构的指针
ND_ADDRLIST
指向 nd_addrlist 结构的指针
char *taddr2uaddr(struct netconfig *nconf, struct netbuf *addr);

taddr2uaddr(3NSL) 可转换 addr 指向的地址,并返回该地址与传输无关的字符表示形式。此字符表示形式称为通用地址。nconf 中给定的值可指定该地址针对其有效的传输。通用地址可通过 free(3C) 进行释放。

struct netbuf *uaddr2taddr(struct netconfig *nconf, char *uaddr);

uaddr 所指向的通用地址会转换为 netbuf 结构。nconf 可指定该地址针对其有效的传输。

int netdir_options(const struct netconfig *config,
          const int option, const int fildes, char *point_to_args);

netdir_options(3NSL) 提供了特定于传输的功能(如 TCP 和 UDP 的广播地址和保留端口功能)的接口。nconf 的值指定传输,而 option 则指定要执行的特定于传输的操作。option 中的值可能会导致忽略 fd 中的值。第四个参数指向特定于操作的数据。

下表说明了用于 option 的值。

表 11-3 netdir_options 的值

选项
说明
ND_SET_BROADCAST
在传输支持广播时设置广播的传输
ND_SET_RESERVEDPORT
在传输允许的情况下使应用程序绑定到保留端口
ND_CHECK_RESERVEDPORT
在传输支持保留端口的情况下验证地址是否对应于保留端口
ND_MERGEADDR
将本地有意义的地址转换为客户机主机可连接到的地址

netdir_perror(3NSL) 例程会在 stderr 中显示一条消息,说明用来将名称映射到地址的例程之一失败的原因。

void netdir_perror(char *s);

netdir_sperror(3NSL) 返回一个字符串,其中包含的错误消息说明了用来将名称映射到地址的例程之一失败的原因。

char *netdir_sperror(void);

以下示例说明了如何执行网络选择和名称到地址映射。

示例 11-1 网络选择和名称到地址映射

#include <netconfig.h>
#include <netdir.h>
#include <sys/tiuser.h>

struct nd_hostserv nd_hostserv;   /* host and service information */
struct nd_addrlist *nd_addrlistp; /* addresses for the service */
struct netbuf *netbufp;           /* the address of the service */
struct netconfig *nconf;          /* transport information*/
int i;                            /* the number of addresses */
char *uaddr;                      /* service universal address */
void *handlep;                    /* a handle into network selection */
/*
 * Set the host structure to reference the "date"
 * service on host "gandalf"
 */
nd_hostserv.h_host = "gandalf";
nd_hostserv.h_serv = "date";
/*
 * Initialize the network selection mechanism.
 */
if ((handlep = setnetpath()) == (void *)NULL) {
   nc_perror(argv[0]);
   exit(1);
}
/*
 * Loop through the transport providers.
 */
while ((nconf = getnetpath(handlep)) != (struct netconfig *)NULL)
{
   /*
    * Print out the information associated with the
    * transport provider described in the "netconfig"
    * structure.
    */
   printf("Transport provider name: %s\n", nconf->nc_netid);
   printf("Transport protocol family: %s\n", nconf->nc_protofmly);
   printf("The transport device file: %s\n", nconf->nc_device);
   printf("Transport provider semantics: ");
       switch (nconf->nc_semantics) {
   case NC_TPI_COTS:
      printf("virtual circuit\n");
      break;
   case NC_TPI_COTS_ORD:
      printf("virtual circuit with orderly release\n");
      break;

   case NC_TPI_CLTS:
      printf("datagram\n");
      break;
   }
   /*
    * Get the address for service "date" on the host
    * named "gandalf" over the transport provider
    * specified in the netconfig structure.
    */
   if (netdir_getbyname(nconf, &nd_hostserv, &nd_addrlistp) != ND_OK) {
      printf("Cannot determine address for service\n");
      netdir_perror(argv[0]);
      continue;
   }
   printf("<%d> addresses of date service on gandalf:\n",
      nd_addrlistp->n_cnt);
   /*
    * Print out all addresses for service "date" on
    * host "gandalf" on current transport provider.
    */
   netbufp = nd_addrlistp->n_addrs;
   for (i = 0; i < nd_addrlistp->n_cnt; i++, netbufp++) {
      uaddr = taddr2uaddr(nconf,netbufp);
      printf("%s\n",uaddr);
      free(uaddr);
   }
       netdir_free( nd_addrlistp, ND_ADDRLIST );

}
endnetconfig(handlep);