查找主机名最基本的函数是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;
};
函数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的指针。
返回当前主机名字,通常和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);
#include<unistd.h>
int gethostname(char *name, size_t namelen);
#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,所以第二个调用和第三个调用相同,第四个调用将失败。
#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