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_SOCK_Acceptor 源代码

ACE_INET_Addr 用来封装了基本的LINUX Socket的连接。   首先了解一个结构体 struct sockaddr_in { short s...

IP 地址转换 inet_addr() inet_ntoa() 笔记

inet_addr() inet_ntoa() 及其自实现函数self_inet_ntoa() 和 self_inet_addr()笔记

IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

1、htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short ne...

地址转换函数inet_aton、 inet_ntoa、 inet_addr和inet_pton 、inet_ntop

inet_aton,inet_addr和inet_ntoa在点分十进制数串(如,“192.168.1.10")与他的32位网络字节二进制值之间转换IPV4地址,有2个比较新的函数inet_pton和i...

使用 Addr2line 将函数地址解析为函数名

用 Addr2line 将函数地址解析为函数名 原文链接:http://www.ibm.com/developerworks/cn/linux/l-graphvis/  Addr2...

用 Addr2line 将函数地址解析为函数名

原文链接:http://www.ibm.com/developerworks/cn/linux/l-graphvis/  Addr2line 工具(它是标准的 GNU Binutils 中的...

关于用addr2line解析函数地址的一个小探索

最近知道用dmesg和addr2line配合能定位出段错误的具体行。于是自己做了个小实验,在试验中发现,这个办法有时候也是不灵光的,具体取决于段错误的类型。 我写的小程序: 编译之后运行出现段...

TCP/IP源码学习(58)——inet_select_addr函数分析

作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net    本文的copyleft归gf...

inet addr、bcast、mask

bcast:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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