UNPv1第九章:基本名字与地址转换

1.gethostbyname

查找主机名最基本的函数是gethostbyname,如果成功,它返回一个指向结构hostent的指针,该结构中包含了该主机的所有IPv4或IPv6地址

#include<netdb.h>
struct hostent *gethostbyname(const char *hostname);

hostent结构如下:

struct hostent{
    char *h_name;//official name of host
    char * *h_aliases;
    int h_addrtype;//AF_INET or AF_INET6
    int h_length;//length of address: 4 or 16
    char * *h_addr_list;
};

2.gethosybyaddr

函数gethostbyaddr取一个二进制IP地址并试图找到相应于此地址的主机名,这与gethostbyname的行为刚好相反

#include<netdb.h>
struct hostent *gethostbyaddr(const char *addr, size_t len, int family);

参数addr不是char *类型,而是一个真正指向含有IPv4或IPv6地址的结构in_addr或in6_addr的指针。

3.uname函数

返回当前主机名字,通常和gethostbyname一起用来确定本地主机的IP地址

#include <sys/utsname.h>
int uname (struct utsname *name);
        返回:非负值——成功,-1——失败

utsname结构如下:

#define UTS_NAMESIZE 16
#define UTS_NODESIZE 256
struct utsname{
   char sysname[_UTS_NAMESIZE];//当前操作系统名
   char nodename[_UTS_NODESIZE];//网络节点的名称
   char release[_UTS_NAMESIZE];//当前发布级别
   char version[_UTS_ NAMESIZE];//当前发布版本
   char machine[_UTS_ NAMESIZE];//硬件类型
}

获取IP方法:

struct utsname  myname;
uname(&myname);
struct hostent *hptr = gethostbyname(myname.nodename);

4.gethostname函数(也返回当前主机名字)

#include<unistd.h>
int gethostname(char *name, size_t namelen);

5.getservbyname函数(通过给定名字查找服务)

#include<netdb.h>
struct servent *getservbyname( const char *servname, const char *protoname );
成功:返回servent类型非空指针;失败:空指针;
struct servent{
      char      *s_name;          // 服务的正是名字
      char      **s_aliases;      // 别名列表
      int       s_port;           // 服务端口号
      char      *s_proto;         // 使用的协议
};

服务名参数servname必须指定。如果同时指定了协议(即protoname参数为非空指针),那么指定的服务必须有匹配的协议。
servent结构中关心的主要是端口号。
注意:该端口号是以网络字节的顺序返回的,因此把它存放到套接口地址结构时绝对不能调用htons。
典型调用:

struct servent *sptr
sptr = getsrvbyname(“domain”, “udp”);       //DNS using UDP
sptr = getsrvbyname(“ftp”, “tcp”);          //FTP using TCP
sptr = getsrvbyname(“ftp”, NULL);           //FTP using TCP
sptr = getsrvbyname(“ftp”, “udp”);          //this call will fall

由于FTP仅支持TCP,所以第二个调用和第三个调用相同,第四个调用将失败。

6.getservbyport在给定端口号和可选协议后查找相应的服务

#include<netdb.h>
struct servent *getservbyport( int port, const char *portname );
成功:返回servent类型非空指针;失败:空指针;

Port必须为网络字节序。对此函数的典型调用:

struct servent *sptr
sptr = getsrvbyport( htons(53), “udp”);         //DNS using UDP
sptr = getsrvbyport( htons(21), “tcp”);         //FTP using TCP
sptr = getsrvbyport( htons(21), NULL);          //FTP using TCP
sptr = getsrvbyport( htons(21), “udp”);         //this call will fall,UDP没有服务使用端口21

你可能感兴趣的:(UNPv1第九章:基本名字与地址转换)