首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNPv1第九章:基本名字与地址转换

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

作者头像
提莫队长
发布2019-02-21 11:05:28
4450
发布2019-02-21 11:05:28
举报
文章被收录于专栏:刘晓杰刘晓杰

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.gethostbyname
  • 2.gethosybyaddr
  • 3.uname函数
  • 4.gethostname函数(也返回当前主机名字)
  • 5.getservbyname函数(通过给定名字查找服务)
  • 6.getservbyport在给定端口号和可选协议后查找相应的服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档