Ns3 InetSocketAddress类

711 阅读1分钟

翻译自www.nsnam.org/doxygen/cla…

一个内部地址类型。

InetSocketAddress类型类似于BSD socket API中的 inet_sockaddr。类型中包括一个IPv4地址和一个IPv4传输端口。

存在于inet-socket-address.h中,源码如下:

class InetSocketAddress
 {
 public:
   InetSocketAddress (Ipv4Address ipv4, uint16_t port);
   InetSocketAddress (Ipv4Address ipv4);
   InetSocketAddress (uint16_t port);
   InetSocketAddress (const char *ipv4, uint16_t port);
   InetSocketAddress (const char *ipv4);
   uint16_t GetPort (void) const;
   Ipv4Address GetIpv4 (void) const;
   uint8_t GetTos (void) const;
 
   void SetPort (uint16_t port);
   void SetIpv4 (Ipv4Address address);
   void SetTos (uint8_t tos);
 
   static bool IsMatchingType (const Address &address);
 
   operator Address () const;
 
   static InetSocketAddress ConvertFrom (const Address &address);
 private:
   Address ConvertTo (void) const;
 
   static uint8_t GetType (void);
   Ipv4Address m_ipv4; 
   uint16_t m_port;    
   uint8_t m_tos;      
 };

(1)构造函数

  • InetSocketAddress (Ipv4Address ipv4, uint16_t port)

参数:

ipv4: ipv4地址

port:端口号

源码:

InetSocketAddress::InetSocketAddress (Ipv4Address ipv4, uint16_t port)
   : m_ipv4 (ipv4),
     m_port (port),
     m_tos (0)
 {
   NS_LOG_FUNCTION (this << ipv4 << port);
 }
  • InetSocketAddress (Ipv4Address ipv4)

参数:

ipv4: ipv4地址

端口号默认为0

 InetSocketAddress::InetSocketAddress (Ipv4Address ipv4)
   : m_ipv4 (ipv4),
     m_port (0),
     m_tos (0)
 {
   NS_LOG_FUNCTION (this << ipv4);
 }
  • InetSocketAddress(uint16_t port)

参数:

port:端口号

ipv4地址默认被分配到任何地址。

InetSocketAddress::InetSocketAddress (uint16_t port)
   : m_ipv4 (Ipv4Address::GetAny ()),
     m_port (port),
     m_tos (0)
 {
   NS_LOG_FUNCTION (this << port);
 }
  • InetSocketAddress (const char *ipv4, uint16_t port);

参数:

ipv4: 一个字符串代表一个ipv4地址

port:端口号

 InetSocketAddress::InetSocketAddress (const char *ipv4, uint16_t port)
   : m_ipv4 (Ipv4Address (ipv4)),
     m_port (port),
     m_tos (0)
 {
   NS_LOG_FUNCTION (this << ipv4 << port);
 }
  • InetSocketAddress (const char *ipv4)

参数:

ipv4:一个字符串代表一个ipv4地址

端口数默认为0

 InetSocketAddress::InetSocketAddress (const char * ipv4)
   : m_ipv4 (Ipv4Address (ipv4)),
     m_port (0),
     m_tos (0)
 {
   NS_LOG_FUNCTION (this << ipv4);
 }

(2)成员函数

  • ConvertFrom (const Address &address)

    返回一个与输入参数类型Address对应的InetSocketAddress

 InetSocketAddress 
 InetSocketAddress::ConvertFrom (const Address &address)
 {
   NS_LOG_FUNCTION (&address);
   NS_ASSERT (address.CheckCompatible (GetType (), 7));
   uint8_t buf[7];
   address.CopyTo (buf);
   Ipv4Address ipv4 = Ipv4Address::Deserialize (buf);
   uint16_t port = buf[4] | (buf[5] << 8);
   uint8_t tos = buf[6];
   InetSocketAddress inet (ipv4, port);
   inet.SetTos (tos);//改变tos值
   return inet;
 }
参数:

需要转换的Address实例。

源码解析:

(1)第5行中 address.CheckCompatible (GetType (), 7)

bool CheckCompatible (uint8_t type, uint8_t len) const;

这个函数用来判断一个给定的类型是否与这个变量兼容。

(2)第7行 address.CopyTo (buf)

uint32_t CopyTo (uint8_t buffer[MAX_SIZE]) const;

将地址拷贝到一个缓冲区中。

(3)第8行 Ipv4Address::Deserialize (buf)

Ipv4Address 
 Ipv4Address::Deserialize (const uint8_t buf[4])

将缓冲区中字节流反序列化为一个ipv4Address,并返回。

  • ConvertTo (void) const
 Address 
 InetSocketAddress::ConvertTo (void) const
 {
   NS_LOG_FUNCTION (this);
   uint8_t buf[7];
   m_ipv4.Serialize (buf);
   buf[4] = m_port & 0xff;
   buf[5] = (m_port >> 8) & 0xff;
   buf[6] = m_tos;
   return Address (GetType (), buf, 7);
 }
源码解析:

(1)第6行 m_ipv4.Serialize (buf);

void ns3::Ipv4Address::Serialize(uint8_t buf[4]) const

将这个地址序列化到一个4字节的缓冲区。

  • GetIpv4(void )const
 Ipv4Address
 InetSocketAddress::GetIpv4 (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_ipv4;
 }
  • GetPort(void )const
 uint16_t
 InetSocketAddress::GetPort (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_port;
 }
  • GetTos(void )const
 uint8_t
 InetSocketAddress::GetTos (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_tos;
 }
  • GetType (void)
 uint8_t 
 InetSocketAddress::GetType (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
   static uint8_t type = Address::Register ();
   return type;
 }

获取基础地址类型(自动分配)。

源码解析:

(1)第5行 Address::Register ()

static uint8_t Register (void);

用来分配一个新的地址类型id。

  • IsMatchingType(const Address & address)
 bool
 InetSocketAddress::IsMatchingType (const Address &address)
 {
   NS_LOG_FUNCTION (&address);
   return address.CheckCompatible (GetType (), 7);
 }
源码解析:

(1)第5行 address.CheckCompatible (GetType (), 7)

bool CheckCompatible (uint8_t type, uint8_t len) const;

用来解析这个给的类型(type)与这个变量(len)是否兼容。

  • operator Address() const
     InetSocketAddress::operator Address () const
     {
       return ConvertTo ();
     }
    

    一个Address实例,它表示这个InetSocketAddress实例。

  • SetIpv4 (Ipv4Address address)
 InetSocketAddress::SetIpv4 (Ipv4Address address)
 {
   NS_LOG_FUNCTION (this << address);
   m_ipv4 = address;
 }

​ 设置新的ipv4地址

  • SetPort (uint16_t port)
 void 
 InetSocketAddress::SetPort (uint16_t port)
 {
   NS_LOG_FUNCTION (this << port);
   m_port = port;
 }

设置新端口。

  • SetTos (uint8_t tos)
 void
 InetSocketAddress::SetTos (uint8_t tos)
 {
   NS_LOG_FUNCTION (this << tos);
   m_tos = tos;
 }

设置新的tos值。