Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116715
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-06-24 14:48:04

一. gethostbyname
1. 获取主机名
  1. 在/usr/include/netdb.h中
  2. struct hostent
  3. {
  4.   char *h_name;          //主机的规范名:参见下面的sina.com
  5.   char **h_aliases;      //主机的别名,可能有很多个所以这儿是个list
  6.   int h_addrtype;        //ip地址类型,AF_INET(IPv4),AF_INET6(IPv6)
  7.   int h_length;          //ip地址长度: 为4
  8.   char **h_addr_list;    //主机的ip地址:网络字节序存储的
  9. };
例如地址为:202.102.75.147
网络字节序是:0xca 0x66 0x4b 0x93
2.源码
  1. cong@msi:/work/test/tcpip/19echo$ cat name.c
  2. #include "utils.h"

  3. int main ( int argc, char *argv[] )
  4. {
  5.     char *ptr, **pptr;
  6.     char str[INET_ADDRSTRLEN];
  7.     struct hostent *hptr;
  8.     while( --argc > 0)
  9.     {
  10.         ptr = *++argv;
  11.         if( (hptr = gethostbyname(ptr)) == NULL)
  12.         {
  13.             dbmsg("gethostbyname error");
  14.             continue;
  15.         }
  16.         dbmsg("official hostname: %s", hptr->h_name);
  17.         for(pptr=hptr->h_aliases; *pptr!=NULL; pptr++)
  18.             dbmsg("alias:%s", *pptr);
  19.         switch( hptr->h_addrtype)
  20.         {
  21.             case AF_INET:
  22.                 pptr = hptr->h_addr_list;
  23.                 for(; *pptr!=NULL; pptr++)
  24.                     dbmsg("address:%s", inet_ntop(hptr->h_addrtype,*pptr,str, sizeof(str)));
  25.                 break;
  26.         }
  27.     }
  28.     return EXIT_SUCCESS;
  29. }
utils.h
  1. cong@msi:/work/test/tcpip/19echo$ cat utils.h
  2. #ifndef UTILS_H__
  3. #define UTILS_H__
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h> /* See NOTES */
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <time.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. #include <signal.h>
  14. #include <netdb.h>

  15. #define MAXLINE 1024

  16. #define LISTENQ 10
  17. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)
  18. #define max(a,b) ((a) > (b) ? (a) : (b))

  19. #endif
3.运行结果
  1. cong@msi:/work/test/tcpip/19echo$ ./name www.baidu.com
  2. name.c:main[16]: official hostname: www.a.shifen.com
  3. name.c:main[18]: alias:www.baidu.com
  4. name.c:main[24]: address:180.97.33.108
  5. name.c:main[24]: address:180.97.33.107

  6. cong@msi:/work/test/tcpip/19echo$ ./name www.sina.com
  7. name.c:main[16]: official hostname: newsnj.sina.com.cn    //看到没,主机的规范名与输入的是不一样的
  8. name.c:main[18]: alias:www.sina.com
  9. name.c:main[18]: alias:us.sina.com.cn
  10. name.c:main[18]: alias:news.sina.com.cn
  11. name.c:main[18]: alias:jupiter.sina.com.cn
  12. name.c:main[24]: address:202.102.75.147
hostname.rar (下载后改名为hostname.tar.gz)
二. gethostbyaddr
2.1 查看gethostbyaddr的man_page 
  1. a.原型:
  2. #include <sys/socket.h> /* for AF_INET */
  3. struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
  4. b.参数说明
  5. type: The gethostbyaddr() valid address types are AF_INET and AF_INET6.
  6. addr: The host address argument is a pointer to a struct of a type depending on the address type, for example a struct in_addr * (probably obtained via a call to inet_addr(3)) for address type AF_INET. (addr参数可以通过net_addr()来得到)
2.2 代码
  1. cong@msi:/work/test/tcpip/ch11/hostaddr$ cat addr.c
  2. #include "utils.h"

  3. int main ( int argc, char *argv[] )
  4. {
  5.     struct hostent *hptr;
  6.     long addr;
  7.     if (argc != 2) {
  8.         fprintf(stderr, "usage: %s i.p.addres", argv[0]);
  9.         exit(1);
  10.     }
  11.     addr = inet_addr(argv[1]);
  12.     hptr = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
  13.     if(NULL == hptr)
  14.     {
  15.         dbmsg("host %s not found", argv[1]);
  16.         exit(1);
  17.     }
  18.     dbmsg("Hostname:%s", hptr->h_name);
  19.     while (hptr->h_aliases[0])
  20.         dbmsg("Aliases:%s", *hptr->h_aliases++);
  21.     while (hptr->h_addr_list[0])
  22.         dbmsg("Addresses:%s", inet_ntoa(*(struct in_addr *) * hptr->h_addr_list++));
  23.     return EXIT_SUCCESS;
  24. }
2.3 运行结果
  1. cong@msi:/work/test/tcpip/ch11/hostaddr$ ./addr 8.8.8.8
  2. addr.c:main[19]: Hostname:google-public-dns-a.google.com
  3. addr.c:main[23]: Addresses:8.8.8.8
hostaddr.rar (下载后改名为hostaddr.tar.gz)

三. gethostbyname
3.1 获取主机的服务
  1. #include
  2. struct servent
  3. {
  4.   char *s_name;            //表示服务的名称
  5.   char **s_aliases;        //服务的别名链表
  6.   int s_port;              //端口号
  7.   char *s_proto;           //服务的协议
  8. };
也可在以/etc/services中查看
3.2 代码
  1. cong@msi:/work/test/tcpip/ch11/servname$ cat servname.c
  2. #include "utils.h"

  3. int main ( int argc, char *argv[] )
  4. {
  5.     struct servent * sptr;
  6.     if (argc != 3) {
  7.         fprintf(stderr, "usage: %s i.p.addres", argv[0]);
  8.         exit(1);
  9.     }
  10.     sptr = getservbyname(argv[1], argv[2]);
  11.     if(NULL == sptr)
  12.     {
  13.         dbmsg("%s:%s not found",argv[1], argv[2]);
  14.         exit(0);
  15.     }
  16.     dbmsg("name=%s, port=%d, protocal=%s",
  17.             sptr->s_name, ntohs(sptr->s_port), sptr->s_proto);

  18.     return EXIT_SUCCESS;
  19. }
3.2 运行结果
  1. cong@msi:/work/test/tcpip/ch11/servname$ ./servname domain udp
  2. servname.c:main[17]: name=domain, port=53, protocal=udp
  3. cong@msi:/work/test/tcpip/ch11/servname$ ./servname ftp tcp
  4. servname.c:main[17]: name=ftp, port=21, protocal=tcp
  5. cong@msi:/work/test/tcpip/ch11/servname$ ./servname ftp udp
  6. servname.c:main[13]: ftp:udp not found
servname.rar (下载后改名为servname.tar.gz)
四. getservbyport
4.1 代码
  1. cong@msi:/work/test/tcpip/ch11/servport$ cat servport.c
  2. #include "utils.h"

  3. int main ( int argc, char *argv[] )
  4. {
  5.     struct servent * sptr;
  6.     int port;
  7.     if (argc != 3) {
  8.         fprintf(stderr, "usage: %s i.p.addres", argv[0]);
  9.         exit(1);
  10.     }
  11.     port = atoi(argv[1]);                          //第1个参数是int型
  12.     sptr = getservbyport(htons(port), argv[2]);    //并一定要转为网络字节序
  13.     if(NULL == sptr)
  14.     {
  15.         dbmsg("%s:%s not found",argv[1], argv[2]);
  16.         exit(0);
  17.     }
  18.     dbmsg("name=%s, port=%d, protocal=%s",
  19.             sptr->s_name, ntohs(sptr->s_port), sptr->s_proto);

  20.     return EXIT_SUCCESS;
  21. }
4.2 运行结果
  1. cong@msi:/work/test/tcpip/ch11/servport$ ./servport 53 udp
  2. servport.c:main[19]: name=domain, port=53, protocal=udp
  3. cong@msi:/work/test/tcpip/ch11/servport$ ./servport 21 tcp
  4. servport.c:main[19]: name=ftp, port=21, protocal=tcp
  5. cong@msi:/work/test/tcpip/ch11/servport$ ./servport 21 udp
  6. servport.c:main[19]: name=fsp, port=21, protocal=udp
servport.rar (下载后改名为servport.tar.gz)    

五. getaddrinfo

int getaddrinfo(const char *node, const char *service,
                       const struct addrinfo *hints,
                       struct addrinfo **res);







阅读(909) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~