ACE_INET_Addr地址类浅解析

原创 2015年11月20日 16:59:24

说起网络编程,第一个我们必须想到的就是socket等系类函数,而这些函数的调用中有一个十分重要的参数sockaddr_in这个Ipv4的结构体,这个结构体表示了网络地址,即通信地址,但是玩过它的人都知道,大量的细节我们必须注意,包括初始化,转变字节序等等的一系列的重复的动作很是令人厌烦。
但在ACE中,这些细节ACE_INET_Addr都帮你做了,使用起来很方便,而且不用担心安全问题,那么这里就解析一些常用的函数。

首先我们先来看一下这个类中的成员变量,我们的地址是如何保存在这个类中的:

 union
  {
    sockaddr_in  in4_;
#if defined (ACE_HAS_IPV6)
    sockaddr_in6 in6_;
#endif /* ACE_HAS_IPV6 */
  } inet_addr_;

这里就是保存我们地址的变量,从这里可以看出来,这个类Ipv4和Ipv6的地址它都支持,所以不用再为使用sockaddr_in还是sockaddr_in6而困扰了。

看一个类,首先要看的就是构造函数,ACE_INET_Addr的构造函数有很多个,当然,我们只看常用的:

ACE_INET_Addr (const sockaddr_in *addr, int len);

使用一个sockaddr_in指针来初始化,第二个参数为sizeof(addr).

ACE_INET_Addr (u_short port_number,
                 const char host_name[],
                 int address_family = AF_UNSPEC);

第一个参数为port值(不是网络字节序也可以),第二个参数为ip字符串(“127.0.0.1”),第三个参数地表地址族表示ipv4和ipv6都支持,后面有很多,都是这个意思

explicit ACE_INET_Addr (const char address[],
                          int address_family = AF_UNSPEC);

这个构造函数的第一个参数比较特别,address这个字符串会被解释为”ip:port”若没有字符’:’,则解释为port值,那么IP则默认为INANY_ADDR,例如(“127.0.0.1:6000”)

explicit ACE_INET_Addr (u_short port_number,
                          ACE_UINT32 ip_addr = INADDR_ANY)

第一个参数为端点值,只需要一个端点值就可以构造这个结构

构造函数就到这里,下面是set系列函数,这些函数大部分与构造函数对应,但是也有一些小的差别。

int set (u_short port_number,
           const char host_name[],
           int encode = 1,
           int address_family = AF_UNSPEC);

这个函数比其对应的构造函数多了一个参数encode参数,这个参数的意思是:若为真,则默认encode为网络字节序,下面的都是一样的含义

int set (u_short port_number,
           ACE_UINT32 ip_addr = INADDR_ANY,
           int encode = 1,
           int map = 0);

一个port值确定一个结构体,map的意义是若为真,得到一个ipv4映射的ipv6地址

int set (const char addr[], int address_family = AF_UNSPEC);

这个addr的格式跟上面的那个构造函数一样的格式,就是看那个字符’:’

下面就是一些常用的操作函数了:

virtual int addr_to_string (ACE_TCHAR buffer[],
                              size_t size,
                              int ipaddr_format = 1) const;

ACE_TCHAR 可以看做是char类型,前两个参数分别是指针和数组长度,第三个参数必须说一下数组的返回的格式。
当我们调用这个函数的时候,内部会将地址和端口号结合为“ip:port”的形式,若第三个参数为假,则将ip转化为对应的名称。
下面是一个简单的例子来说明:

#include"ace/INET_Addr.h"
#include"ace/OS.h"
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
    ACE_INET_Addr seraddr(6666, "127.0.0.1");
    char str[20] = {};
    seraddr.addr_to_string(str, sizeof(str),1);
    ACE_OS::printf("%s\n", str);
    seraddr.addr_to_string(str, sizeof(str), 0);//将第三个参数改为false
    ACE_OS::printf("%s\n", str);
    return 0;
}

输出结果为:
这里写图片描述

可以看到第三个参数的不同,打印的字符串是不同的。

int get_host_name (char hostname[],
                     size_t hostnamelen) const;
const char *get_host_addr (char *addr, int addr_size) const;

参数都是字符串指针,和数组长度,得到的是信息就和它们的函数名称一样。

u_short get_port_number (void) const;

用法很简单,得到的就是port_number

希望对看完的你们带来些帮助。

ACE学习手记----ACE_INET_Addr类

ACE_INET_Addr类,在这个ACE_网络框架中,应该是比较重要的辅助类,该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内。方便用户...
  • chenxiaohong3905
  • chenxiaohong3905
  • 2008年11月16日 14:29
  • 7739

关于ACE_INET_Addr和ACE_SOCK_Connector的小技巧

最近在处理ACE的相关问题,被ACE_INET_Addr这个貌似不起眼的类吃惊了一下。以此文记录备案。 ACE_INET_Addr:  以前在使用ACE_INET_Addr时,基本都是利用...
  • james506
  • james506
  • 2012年11月28日 14:03
  • 1716

ACE_INET_Addr

目录 一、        关于WAP的常见问答二、       关于WML的常见问答三、       关于WAP开发的常见问答四、关于WMLScript的常见问答五、关于WBMP的常见问答六、关于WA...
  • win2ks
  • win2ks
  • 2007年09月21日 15:25
  • 5615

ACE_Acceptor类源码浅解析

接受器/连接器模式设计用于降低连接建立与连接建立后所执行的服务之间的耦合。例如,在WWW浏览器中,所执行的服务或“实际工作”是解析和显示客户浏览器接收到的HTML页面。连接建立是次要的,可能通过BSD...
  • FebruarySwallow
  • FebruarySwallow
  • 2015年11月16日 19:36
  • 814

ACE-IP包装ACE_INET_Addr类

ACE对于IP地址的包装类主要是在INET_Addr.h文件,类ACE_INET_Addr中。 ACE_INET_Addr类继承自ACE_Addr类(位于Addr.h中),ACE_Addr定义了独立...
  • zhoutong12589
  • zhoutong12589
  • 2017年11月09日 21:25
  • 50

CSS 之 浅入浅出

css,层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表、层次结构式样式表文件,一 种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜...
  • zhangzijiejiayou
  • zhangzijiejiayou
  • 2014年10月09日 09:20
  • 1791

React学习之扩展浅比较(三十四)

注意 这玩意也已经被React.PureComponent的功能取代了,这里依旧是提一下(主要是React.v15的版本中的react-with-addons.js,这些玩意还存在,哎,害人呐) ...
  • qq_18661257
  • qq_18661257
  • 2017年04月02日 10:00
  • 1221

java 浅堆和深堆

浅堆和深堆 浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,它们分别表示一个对象结构所占用的内存大小和一个对象被GC回收后,可以真实释放的内存大小。 ...
  • luohai859
  • luohai859
  • 2016年02月29日 16:47
  • 1181

java中File类浅解析

File类 File类是java.io包中唯一代表磁盘文件本身的对象 调用此类的 getParent() 方法可以获取抽象路径名的父 路径名,它由路径名前缀以及路径名名称序列中的每个名称(最后一个...
  • qq_27489007
  • qq_27489007
  • 2016年07月21日 23:30
  • 145

使用matlab求解二维浅水方程的数值解(一)—浅水波

最近在读《ocean modelling for beginners》这本书,对于做海洋数值模拟工作的小白来说,这绝对是一本好书。强烈推荐给理论基础较弱的学习者,这本书循序渐进,由简入繁的讲解了物理海...
  • u011797078
  • u011797078
  • 2017年02月24日 14:50
  • 808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACE_INET_Addr地址类浅解析
举报原因:
原因补充:

(最多只允许输入30个字)