您的位置:首页 > 其它

UNIX Network Programming笔记之第十一章(一)

2014-03-31 23:18 267 查看
    第九、十章讲述SCTP协议及套接字编程, 第一次阅读暂时跳过。

    第十一章讲述名字与地址转换

    DNS

    DNS,即域名系统,主要用于主机名字与IP地址之间的转换。DNS中的条目称为RR,资源记录resource record,一共有以下若干种:
    1. A   A记录把一个主机名映射为一个32位的IPv4地址
    2. AAAA    AAAA记录把一个主机名映射为一个128位的IPv6地址
    3. PTR    把IP地址转换成主机名。对于IPv4地址,32位地址的4个字节先反转顺序, 每个字节都转换成各自的十进制ASCII值,然后再加上in-addr.arpa,结果字符串用于PTR查询;对于IPv6地址,128位地址的32个4位组先反转顺序,每个四位组转换成十六进制ASCII值,然后再加上ip6.arpa
    4. MX    将右侧的主机指定成左侧给定主机的邮件交换器
    5. CNAME    CNAME代表规范名字,为常用的服务指派CNAME记录
    示例:
    freebsd       IN      A          12.106.32.254
                         IN      AAAA    3ffe:b80:1f8d:1:a00:20ff:fea7:686b
                         IN      MX        5  freebsd.unpbook.com
                         IN      MX        10 mailhost.unpbook.com

     gethostbyname函数

    gethostbyname函数返回主机名对应的IPv4地址
struct hostent *gethostbyname(const char *hostname);
//成功返回非NULL指针,失败返回NULL,同时设置h_errno

struct hostent{
char *h_name;    //规范主机名
char **h_aliases;  //别名
int h_addrtype;    //主机地址类型:AF_INET4
int h_length;     //地址字节长度:4
char **h_addr_list;   //映射ip列表
};



    gethostbyname出错不设置errno变量,而是设置全局变量h_errno,有strerror函数将h_errno变量作为唯一参数,返回const char *指针,指向相应错误说明。

    gethostbyaddr函数

    gethostbyaddr函数试图由一个二进制的IP地址得到相应的主机名
#include <netdb.h>
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
//成功返回非NULL指针,失败返回NULL,同时设置h_errno
    这里addr是指向某个in_addr结构的指针;len对于IPv4为4;family为AF_INET

    getservbyname和getservbyport函数

    getservbyname根据给点名字查找相应服务。
#include <netdb.h>
struct servent *getservbyname(const char *hostname, const char *protoname);
//成功返回非空指针,失败返回NULL
struct servent{
char *s_name;  //正式服务名
char **s_aliases;  //服务别名
int s_port;   //端口号(网络字节序)
char *s_proto;  //协议名称
};
    getservbyport根据给定端口号查找相应服务。
#include<netdb.h>
struct servent *getaddrbyport(int port, const char *protoname);
//成功返回非NULL指针,失败返回NULL
    port参数必须是网络字节序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息