前言

最近在学习网络编程,用到几个应该比较常用的网络编程函数,所以写篇博客来记录一下,毕竟学得快忘得也快。国庆节在宿舍写着博客看着各个景点人山人海倒也快哉~

gethostbyname( )

这个函数可以返回给定域名的域名信息。

参数:域名

返回值:

  • 一个 hostent 结构体的地址(也就是一个指向 hostent 结构体的指针)
  • 0(如果域名不能解析成 IP 地址)

netdb.h头文件我们可以找到 hostent 结构体的说明:

  1. struct hostent {
  2. char *h_name; /*official host name */
  3. char **h_aliases; /*other aliases */
  4. int h_addrtype; /*address type */
  5. int h_length; /* address length */
  6. char **h_addr_list; /* list of addresses */
  7. };
  8. #define h_addr h_addr_list[0]

上面结构体中的 **h_addr_list 是一个二进制整数的链表,输出的时候要用 inet_ntop( ) 函数转换成点分十进制。

inet_ntop( )

inet_ntop( ) 和 inet_ntop( ) 都是IP地址转换函数,可以在将IP地址在“二进制整数”和“点分十进制”之间转换。而且,这2个函数能够处理 ipv4 和 ipv6 。

  1. const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和inet_pton相同,只是多了一个参数 socklen_t cnt ,他是所指向缓存区 dst 的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将 errno 置为 ENOSPC 。

现在那就来实战一下吧:

  1. #include <stdio.h>
  2. #include <netdb.h>
  3. #include <arpa/inet.h>
  4. int main(int argc, char **argv)
  5. {
  6. struct hostent *hptr;
  7. char *name, **pptr, str[32];
  8. int count = 0;
  9. if (argc < 2) {
  10. printf("The arguments is not enough!");
  11. return -1;
  12. }
  13. name = argv[1];
  14. hptr = gethostbyname(name);
  15. if (hptr) {
  16. printf("the offical name is %s.\n", hptr->h_name);
  17. for(pptr = hptr->h_aliases; *pptr != NULL; pptr++) {
  18. printf("the alias name is %s\n", *pptr);
  19. }
  20. switch (hptr->h_addrtype) {
  21. case AF_INET:
  22. printf("the address type is AF_INET.\n");
  23. break;
  24. case AF_INET6:
  25. printf("the address type is AF_INET6.\n");
  26. break;
  27. default:
  28. break;
  29. }
  30. printf("the address length is %d Bytes.\n", hptr->h_length);
  31. for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++) { //**pptr后移四个字节,即地址后移四位
  32. count ++;
  33. printf("the %dth address is %s.\n", count, inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); //即将转换成的点分十进制存到字符串 str 中返回,溢出则返回空指针
  34. }
  35. } else {
  36. printf("Error!\n");
  37. }
  38. return 0;
  39. }

编译运行:

getservbyname

这个函数可以返回给定服务名和协议名的相关服务信息。

参数:服务名和协议名

返回值:

  • 一个指向 servent 结构体的指针
  • 空指针(发生错误)

netdb.h头文件我们可以找到 hostent 结构体的说明:

  1. struct servent {
  2. char *s_name; /*official service name */
  3. char **s_aliases; /*other aliases */
  4. int s_port; /*port for this service */
  5. char **s_proto; /* protocol to use */
  6. };

返回的结构体中的端口号是按网络字节顺序保存的整数,输出的时候要用 ntohs() 函数转换按主机顺序保存的整数。

ntohs( )

网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。

网络字节顺序与本地字节顺序之间的转换函数:

  1. htonl()--"Host to Network Long"
  2. ntohl()--"Network to Host Long"
  3. htons()--"Host to Network Short"
  4. ntohs()--"Network to Host Short"

现在就来实战一下吧:

  1. #include <stdio.h>
  2. #include <netdb.h>
  3. int main (int argc, char* argv[])
  4. {
  5. struct servent *sptr;
  6. char *service, *protocol;
  7. if (argc < 3) {
  8. printf("The arguments is not enough!\n");
  9. return -1;
  10. }
  11. service = argv[1];
  12. protocol = argv[2];
  13. sptr = getservbyname(service, protocol);
  14. if (sptr) {
  15. printf("the port of service %s using %s protocol is %d.\n", sptr->s_name, protocol, ntohs(sptr->s_port)); //将网络字节顺序的端口值转换成主机顺序
  16. } else {
  17. printf("Error!\n");
  18. }
  19. return 0;
  20. }

编译运行:

Linux 网络编程: gethostbyname( ), getservbyname( )的更多相关文章

  1. linux网络编程 gethostbyname()

    gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针.结构的声明与gethostaddr()中一致. 返回对应于给定主机名的主机信息. #include ...

  2. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  3. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  4. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  6. Proxy源代码分析——谈谈如何学习Linux网络编程

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...

  7. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

  8. Linux网络编程:一个简单的正向代理服务器的实现

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...

  9. Linux网络编程基础API

    第5章 Linux网络编程基础API 探讨Linux网络编程基础API与内核中TCP/IP协议族之间的关系,并未后续章节提供编程基础.从3个方面讨论Linux网络API. socket地址API.so ...

随机推荐

  1. 51nod 1237 最大公约数之和 V3(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...

  2. Installing perl and writing your first perl program in Ubuntu

    Installing perl and writing your first perl program in Ubuntu     Installing perl and writing your f ...

  3. Uber 司机有话说:你以为当个 Uber 司机很轻松?大错特错!

    Uber 最近的负面新闻越来越多.各方成员都在抨击.斥责.揭露 Uber 公司的各种黑幕.今天,来自 Uber 公司的司机为您讲述咱「拼车老司机」自己的故事.你以为开着自己的私家车出去满城市的晃悠接客 ...

  4. 跨浏览器resize事件分析

    resize事件 原生事件分析 window一次resize事件: IE7 触发3次, IE8 触发2次, IE9 触发1次, IE10 触发1次 Chrome 触发1次 FF 触发2次 Opera ...

  5. 高性能JSON库---FastJson(阿里巴巴)

    1.FastJSON简单介绍 Fastjson是一个Java语言编写的高性能功能完好的JSON库. 它採用一种"假定有序高速匹配"的算法,把JSON Parse的性能提升到极致,是 ...

  6. CopyU!新插件 CopyPC2U正式发布!

    CopyPC2U双向拷贝插件今天正式上线!该插件需要CopyU!较新版本的支持,可以帮助将文件从电脑自动的复制到移动设备上. 下载地址:http://kuai.xunlei.com/d/BiIvAED ...

  7. poj 2480 (欧拉函数应用)

    点击打开链接 //求SUM(gcd(i,n), 1<=i<=n) /* g(n)=gcd(i,n),根据积性定义g(mn)=g(m)*g(n)(gcd(m,n)==1) 所以gcd(i,n ...

  8. spring IOC简单入门

    spring的核心是ioc和aop 先介绍一下IOC(inverse of control控制反转)又叫DI(Dependency injection依赖注入) 个人理解为把对象的控制权由类转移到配置 ...

  9. Assertion failure in -[UIView layoutSublayersOfLayer:]

    Assertion failure in -[UIView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2935.137/UIView.m:8 ...

  10. org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file

    org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file   在$TOMCA ...