ACE_INET_Addr类,在这个ACE_网络框架中,应该是比较重要的辅助类,该类主要封装了C SOCKET 的地址对象,通过外观封装的模式,把struct sockaddr_in封装在内。方便用户的操作。
因此个人认为掌握此类的常用构造方法和常用的成员函数,并深刻的理解,对于后续的学习ACE或者开发ACE网络应用程序应该会起到很大的帮助。工欲用其器、必先利其器。就先让我们把ACE_INET_Addr对象深刻的牢记在心中吧。
- #ifndef ACE_INET_ADDR_H
- #define ACE_INET_ADDR_H
- #include /**/ "ace/pre.h"
- #include "ace/Sock_Connect.h"
- #if !defined (ACE_LACKS_PRAGMA_ONCE)
- # pragma once
- #endif /* ACE_LACKS_PRAGMA_ONCE */
- #include "ace/Addr.h"
- #if defined(ACE_VXWORKS)
-
- # include /**/ "inetLib.h"
- #endif /* ACE_VXWORKS */
- ACE_BEGIN_VERSIONED_NAMESPACE_DECL
- class ACE_Export ACE_INET_Addr : public ACE_Addr
- {
- public:
-
-
-
- ACE_INET_Addr (void);
-
-
- ACE_INET_Addr (const ACE_INET_Addr &);
-
-
-
- ACE_INET_Addr (const sockaddr_in *addr, int len);
-
-
-
-
-
-
-
-
- ACE_INET_Addr (u_short port_number,
- const char host_name[],
- int address_family = AF_UNSPEC);
-
- explicit ACE_INET_Addr (const char address[],
- int address_family = AF_UNSPEC);
-
- explicit ACE_INET_Addr (u_short port_number,
- ACE_UINT32 ip_addr = INADDR_ANY);
-
-
-
- ACE_INET_Addr (const char port_name[],
- const char host_name[],
- const char protocol[] = "tcp");
-
- ACE_INET_Addr (const char port_name[],
- ACE_UINT32 ip_addr,
- const char protocol[] = "tcp");
- #if defined (ACE_HAS_WCHAR)
- ACE_INET_Addr (u_short port_number,
- const wchar_t host_name[],
- int address_family = AF_UNSPEC);
- explicit ACE_INET_Addr (const wchar_t address[],
- int address_family = AF_UNSPEC);
- ACE_INET_Addr (const wchar_t port_name[],
- const wchar_t host_name[],
- const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
- ACE_INET_Addr (const wchar_t port_name[],
- ACE_UINT32 ip_addr,
- const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
- #endif /* ACE_HAS_WCHAR */
-
- ~ACE_INET_Addr (void);
-
-
-
-
-
-
- int set (const ACE_INET_Addr &);
-
- int set (u_short port_number,
- const char host_name[],
- int encode = 1,
- int address_family = AF_UNSPEC);
-
- int set (u_short port_number,
- ACE_UINT32 ip_addr = INADDR_ANY,
- int encode = 1,
- int map = 0);
-
-
- int set (const char port_name[],
- const char host_name[],
- const char protocol[] = "tcp");
-
- int set (const char port_name[],
- ACE_UINT32 ip_addr,
- const char protocol[] = "tcp");
-
- int set (const char addr[], int address_family = AF_UNSPEC);
-
-
- int set (const sockaddr_in *,
- int len);
- #if defined (ACE_HAS_WCHAR)
-
- int set (u_short port_number,
- const wchar_t host_name[],
- int encode = 1,
- int address_family = AF_UNSPEC);
- int set (const wchar_t port_name[],
- const wchar_t host_name[],
- const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
- int set (const wchar_t port_name[],
- ACE_UINT32 ip_addr,
- const wchar_t protocol[] = ACE_TEXT_WIDE ("tcp"));
- int set (const wchar_t addr[], int address_family = AF_UNSPEC);
- #endif /* ACE_HAS_WCHAR */
-
-
- virtual void *get_addr (void) const;
- int get_addr_size(void) const;
-
- virtual void set_addr (void *, int len);
-
- virtual void set_addr (void *, int len, int map);
-
- virtual int addr_to_string (ACE_TCHAR buffer[],
- size_t size,
- int ipaddr_format = 1) const;
-
- virtual int string_to_addr (const char address[],
- int address_family = AF_UNSPEC);
- #if defined (ACE_HAS_WCHAR)
-
- #endif /* ACE_HAS_WCHAR */
-
- void set_port_number (u_short,
- int encode = 1);
-
- int set_address (const char *ip_addr,
- int len,
- int encode = 1,
- int map = 0);
- #if (defined (__linux__) || defined (ACE_WIN32)) && defined (ACE_HAS_IPV6)
-
- int set_interface (const char *intf_name);
- #endif /* (__linux__ || ACE_WIN32) && ACE_HAS_IPV6 */
-
- u_short get_port_number (void) const;
-
- int get_host_name (char hostname[],
- size_t hostnamelen) const;
- #if defined (ACE_HAS_WCHAR)
- int get_host_name (wchar_t hostname[],
- size_t hostnamelen) const;
- #endif /* ACE_HAS_WCHAR */
-
- const char *get_host_name (void) const;
-
- const char *get_host_addr (char *addr, int addr_size) const;
-
- const char *get_host_addr (void) const;
-
-
- ACE_UINT32 get_ip_address (void) const;
-
- bool is_any (void) const;
-
- bool is_loopback (void) const;
-
- bool is_multicast (void) const;
- #if defined (ACE_HAS_IPV6)
-
- bool is_linklocal (void) const;
-
- bool is_ipv4_mapped_ipv6 (void) const;
-
- bool is_ipv4_compat_ipv6 (void) const;
- #endif /* ACE_HAS_IPV6 */
-
- bool operator < (const ACE_INET_Addr &rhs) const;
-
-
-
- bool operator == (const ACE_INET_Addr &SAP) const;
-
-
- bool operator != (const ACE_INET_Addr &SAP) const;
-
-
-
- bool is_ip_equal (const ACE_INET_Addr &SAP) const;
-
- virtual u_long hash (void) const;
-
- void dump (void) const;
-
- ACE_ALLOC_HOOK_DECLARE;
- private:
-
- int get_host_name_i (char hostname[], size_t hostnamelen) const;
-
-
- void *ip_addr_pointer (void) const;
- int ip_addr_size (void) const;
- int determine_type (void) const;
-
- void reset (void);
-
-
-
- union
- {
- sockaddr_in in4_;
- #if defined (ACE_HAS_IPV6)
- sockaddr_in6 in6_;
- #endif /* ACE_HAS_IPV6 */
- } inet_addr_;
- #if defined (ACE_VXWORKS)
- char buf_[INET_ADDR_LEN];
- #endif
- };
- ACE_END_VERSIONED_NAMESPACE_DECL
- #if defined (__ACE_INLINE__)
- #include "ace/INET_Addr.inl"
- #endif /* __ACE_INLINE__ */
- #include /**/ "ace/post.h"
- #endif /* ACE_INET_ADDR_H */
总结:
1.在set、set_port_number、set_address中都提供了一个参数@encode,此参数在构造函数的参数中并没有提供。因为也意味着,使用任何一个构造函数来创建一个ACE_INET_Addr对象时,其地址和端口必须是主机字节序的。如果地址或者端口为网络字节序时,必须转换为主机字节序才可以使用构造函数。或者使用默认的构造函数,在通过set、set_port_number、set_address等成员函数,指定encode参数为FALSE(0)时,也可以直接把网络字节序的地址和端口设置给ACE_INET_Addr对象。如果地址和端口是2中不同的字节序,需要分别使用set_address和set_port_number进行设置,否则就可以使用set函数一次性设置地址和端口。
2.比较2个ACE_INET_Addr对象的相等性。 根据情况使用不同的成员函数。
地址和端口都要相等时,使用 ==进行比较。
只比较地址时,忽略端口时。使用 is_ip_equal 成员函数。
发表于 @
2008年11月16日 14:29:00 | | 编辑|
举报| 收藏