关闭

ACE_INET_Addr地址类浅解析

标签: 网络编程INET-AddrACE地址结构
322人阅读 评论(0) 收藏 举报
分类:

说起网络编程,第一个我们必须想到的就是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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1848次
    • 积分:69
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档