Unix网络编程 gethostbyname函数

gethostbyname函数 : 是将主机名转换成对应的IPv4地址;

包含头文件 #include <netdb.h>

函数原型:

struct hostent *gethostbyname(const char *hostname)
                    //返回: 成功返回一个非空指针,否则返回NULL并设置errno的值

返回:

>>>   调用成功,返回一个指向hostent结构的指针,该结构含有所查找主机的所有IPv4地址;

>>>   调用失败,返回空指针NULL,并重置h_errno全局整数变量的值(一般会调用hstrerror函数返回相应错误的说明)

局限: 只能返回IPv4地址;

hstrerror函数的简单介绍:

它以某个h_errno的值作为唯一的参数,返回的是一个const char * 的指针,指向对应错误的说明;

参数h_errno的简单介绍: 

当发生错误时,系统将全局整数变量h_errno设置为在头文件<netdb.h>中定义的常值:

HOST_NOT_FOUND;

TRY_AGAIN;

NO_RECOVERY;

NO_DATA; (== NO_ADDRESS)

hostent结构的简单介绍:

struct *hostent {
    char  *h_name;        //正式主机名;
    char **h_aliases;     //别名;
    int    h_addrtype;    //地址类型;
    int    h_length;      //地址长度,一般为4;
    char **h_addr_list;   //地址序列;
};

如下图:

注意:

如上图, 因为gethostbyname返回的只能是IPv4的地址,不能返回IPv6的地址,所以结构中的地址类型改成AF_INET,长度改成4,才是正确的;

而且,就算该主机中含有IPv6地址,通过gethostbyname函数调用返回的野仅仅是IPv4地址!!!

如下是gethostbyname函数的一个简单的实现:

给每个命令行参数调用gethostbyname函数;

输出正式主机名(或规范名),后跟别名列表;

pptr指向一个指针数组,其中每个指针指向一个地址,对于每个地址,我们调用inet_ntop函数并输出返回的字符串;

#include <unp.h>
#include <netdb.h>

int
main(int argc, char **argv)
{
    char  *ptr, **pptr;
    char  str[INET_ADDRSTRLEN];
    struct  hostent *hptr;

    while(--argc > 0) {
        ptr = *++argv;
        if((hptr = gethostbyname(ptr)) == NULL) {
            err_msg("gethostbyname error for host : %s : %s",
                    ptr, hstrerror(h_errno));
            continue;
        }
        printf("official hostname : %s\n", hptr->h_name);

        for(pptr=hptr->h_aliases; *pptr!=NULL; pptr++) {
            printf("\taliases : %s\n", *pptr);
        }

        switch(hptr->h_addrtype) {
        case AF_INET:
            pptr = hptr->h_addr_list;
            for( ; *pptr!=NULL; pptr++) {
                printf("\taddress : %s",
                       inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
            }
            break;
        default:
            err_ret("unknown address type");
            break;
        }
    }
    exit(0);
}
时间: 2024-10-05 09:15:08

Unix网络编程 gethostbyname函数的相关文章

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指

【UNIX网络编程(一)】套接字地址结构、网络字节序和地址转换函数

引言:套接字地址结构在网络编程的每个实现中都要用到,因此掌握套接字地址结构是以后编写网络程序的前提,地址结构可以在两个方向上传递:从进程到内核和从内核到进程.地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换. 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.不同协议都有自己的套接字地址结构.通用的套接字地址结构是sockaddr.IPv4套接字地址结构是定义在头文件<netinet/in.h>中的sockaddr_in,其POSIX定义如下: stru

UNIX网络编程——getsockname和getpeername函数

UNIX网络编程——getsockname和getpeername函数 来源:网络转载   http://www.educity.cn/linux/1241293.html 这两个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址即得到对方的地址(getpeername). #include <sys/socket.h> int getsockname(int sockfd,struct sockaddr* localaddr,sock

UNIX网络编程-函数原型

#include <netinet/in.h>struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 address */}; /* network byte ordered */struct sockaddr_in { unit8_t sin_len; /* length of structure (16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O复用适用于以下场合: (1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用 (2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现 (3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用 (4) 如果一个服务器既要适用TCP,

Unix网络编程 之 基本套接字调用(一)

Unix/Linux支持伯克利风格的套接字编程,它同时支持面向连接和面向无连接类型的套接字. 套接字最常用的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() shutdown() setsockopt() getsockopt() getpeername() getsockname() gethostbyname() gethostbyaddr() getse

linux socket网络编程 常用函数及头文件

转自:http://blog.chinaunix.net/u3/102500/showart_2065640.html 一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_DGRAM) 提供无连接的数据传输服务,不保证可靠性. 3.原始式套接字(SOCKET_RAW) 该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一

UNIX网络编程-基本API介绍(二)

参考链接:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx 1.getsockname和getpeername getsockname函数获取与套接口关联的本地协议地址. getpeername函数获取与套接口关联的远程协议地址. ---------------------------------------------------------------------- #include <sys/socket.h> int 

UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select 加阻塞式 I/O 版本. 非阻塞式 I/O 版本.fork 版本.线程化版本.它们都由同一个 main 函数调用来实现同一个功能,即回射程序客户端. 它从标准输入读入一行文本,写到服务器上,读取服务器对该行的回射,并把回射行写到标准输出上. 其中,非阻塞式 I/O 版本是所有版本中执行速度最快的,