address.cpp

来自「JdonFramework need above jdk 1.4.0 This」· C++ 代码 · 共 2,430 行 · 第 1/5 页

CPP
2,430
字号
  // if valid format else null it  if (valid_flag)  {    if (ip_version == version_ipv4)      sprintf((char *) output_buffer,"%d.%d.%d.%d",address_buffer[0],               address_buffer[1], address_buffer[2], address_buffer[3]);    else      sprintf((char *) output_buffer,               "%02x%02x:%02x%02x:%02x%02x:%02x%02x:"               "%02x%02x:%02x%02x:%02x%02x:%02x%02x",               address_buffer[ 0], address_buffer[ 1], address_buffer[ 2],               address_buffer[ 3], address_buffer[ 4], address_buffer[ 5],               address_buffer[ 6], address_buffer[ 7], address_buffer[ 8],               address_buffer[ 9], address_buffer[10], address_buffer[11],               address_buffer[12], address_buffer[13], address_buffer[14],               address_buffer[15]);  }  else    *(char *)output_buffer = 0;  IpAddress *nc_this = PP_CONST_CAST(IpAddress*, this);  nc_this->addr_changed = false;}//-----------------------------------------------------------------// logically and two IPaddresses and// return the new onevoid IpAddress::mask(const IpAddress& ipaddr){  ADDRESS_TRACE;  if (valid() && ipaddr.valid())  {    int count = (ip_version == version_ipv4) ? IPLEN : IP6LEN;    for (int i = 0; i < count; i++)      address_buffer[i] = address_buffer[i] & ipaddr.address_buffer[i];    addr_changed = true;  }}// Get the count of matching bits from the left.int IpAddress::get_match_bits(const IpAddress match_ip) const{  ADDRESS_TRACE;  int bits = 0;  if (valid() && match_ip.valid() &&      (ip_version == match_ip.ip_version))  {    int count = (ip_version == version_ipv4) ? IPLEN : IP6LEN;    for (int i = 0; i < count; i++)    {	if (address_buffer[i] == match_ip.address_buffer[i])	    bits += 8;	else	{	    bits += 7;	    unsigned char c1 = address_buffer[i] >> 1;	    unsigned char c2 = match_ip.address_buffer[i] >> 1;	    while (c1 != c2)	    {		c1 = c1 >> 1;		c2 = c2 >> 1;		bits--;	    }	    break;	}    }  }  return bits;}// Map a IPv4 Address to a IPv6 address.int IpAddress::map_to_ipv6(){  ADDRESS_TRACE;  if (!valid())    return FALSE;  if (ip_version != version_ipv4)    return FALSE;  /* just copy IPv4 address to the end of  the buffer     zero the first 10 bytes and fill 2 Bytes with 0xff */  memcpy(&address_buffer[12], address_buffer, 4);  memset(address_buffer, 0, 10);  address_buffer[10] = 0xff;  address_buffer[11] = 0xff;  smival.value.string.len = IP6LEN;  ip_version = version_ipv6;  addr_changed = true;  return TRUE;}// Reset the objectvoid IpAddress::clear(){  Address::clear();  memset(output_buffer, 0, sizeof(output_buffer));  iv_friendly_name_status = 0;  ip_version = version_ipv4;  memset(iv_friendly_name, 0, sizeof(char) * MAX_FRIENDLY_NAME);  smival.value.string.len = IPLEN;}//=======================================================================//========== Udp Address Implementation =================================//=======================================================================//-------[ construct an IP address with no agrs ]----------------------UdpAddress::UdpAddress()  : IpAddress(){  ADDRESS_TRACE;  // Inherits IP Address attributes  // Always initialize (override) what type this object is  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = UDPIPLEN;  smival.value.string.ptr = address_buffer;  sep = ':';  set_port(0);}//-----------------[ construct an Udp address with another Udp address ]---UdpAddress::UdpAddress(const UdpAddress &udpaddr)  : IpAddress(udpaddr){  ADDRESS_TRACE;  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = udpaddr.smival.value.string.len;  smival.value.string.ptr = address_buffer;  // Copy the port value  sep = ':';  set_port(udpaddr.get_port());  if (!udpaddr.addr_changed)  {    memcpy(output_buffer, udpaddr.output_buffer,	   sizeof(unsigned char) * OUTBUFF);    addr_changed = false;  }}// constructor with a dotted stringUdpAddress::UdpAddress(const char *inaddr) : IpAddress(){  ADDRESS_TRACE;  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = UDPIPLEN;  smival.value.string.ptr = address_buffer;  valid_flag = parse_address(inaddr);  addr_changed = true;}//-----------------[ construct a UdpAddress from a GenAddress ]--------------UdpAddress::UdpAddress(const GenAddress &genaddr) : IpAddress(){  ADDRESS_TRACE;  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  smival.value.string.len = UDPIPLEN;  smival.value.string.ptr = address_buffer;  valid_flag = genaddr.valid();  // allow use of an ip or udp genaddress  if (valid_flag)  {    if (genaddr.get_type() == type_udp)    {      *this = genaddr.cast_udpaddress();      // copy in the IP address data    }    else if (genaddr.get_type() == type_ip)    {      *this = genaddr.cast_ipaddress();      // copy in the IP address data    }    else    {      valid_flag = false;    }  }  sep = ':';}//--------[ construct a udp from an IpAddress ]--------------------------UdpAddress::UdpAddress(const IpAddress &ipaddr):IpAddress(ipaddr){  ADDRESS_TRACE;  // always initialize SMI info  smival.syntax = sNMP_SYNTAX_OCTETS;  if (ip_version == version_ipv4)      smival.value.string.len = UDPIPLEN;  else      smival.value.string.len = UDPIP6LEN;  smival.value.string.ptr = address_buffer;  sep = ':';  addr_changed = true;  set_port(0);}// copy an instance of this ValueSnmpSyntax& UdpAddress::operator=(const SnmpSyntax &val){  ADDRESS_TRACE;  if (this == &val) return *this;   // protect against assignment from itself  valid_flag = false;                // will get set TRUE if really valid  addr_changed = true;  if (val.valid())  {    switch (val.get_syntax())    {      case sNMP_SYNTAX_IPADDR:      {        UdpAddress temp_udp(val.get_printable());        *this = temp_udp;        // valid_flag is set by the udp assignment        break;      }      case sNMP_SYNTAX_OCTETS:        if (((UdpAddress &)val).smival.value.string.len == UDPIPLEN)        {          MEMCPY(address_buffer,((UdpAddress &)val).smival.value.string.ptr,                 UDPIPLEN);	  memset(iv_friendly_name, 0, sizeof(char) * MAX_FRIENDLY_NAME);          valid_flag = true;          ip_version = version_ipv4;          smival.value.string.len = UDPIPLEN;        }        else if (((UdpAddress &)val).smival.value.string.len == UDPIP6LEN)        {          MEMCPY(address_buffer,((UdpAddress &)val).smival.value.string.ptr,                 UDPIP6LEN);	  memset(iv_friendly_name, 0, sizeof(char) * MAX_FRIENDLY_NAME);          valid_flag = true;          ip_version = version_ipv6;          smival.value.string.len = UDPIP6LEN;        }        break;        // NOTE: as a value add, other types could have "logical"        // mappings, i.e. integer32 and unsigned32    }  }  return *this;}// assignment to another UdpAddress object overloadedUdpAddress& UdpAddress::operator=(const UdpAddress &udpaddr){  ADDRESS_TRACE;  if (this == &udpaddr) return *this; // protect against assignment from itself  (IpAddress &)*this = udpaddr; // use ancestor assignment for ipaddr value  if (ip_version == version_ipv4)    smival.value.string.len = UDPIPLEN;  else    smival.value.string.len = UDPIP6LEN;  set_port(udpaddr.get_port());        // copy to port value  if (udpaddr.addr_changed)  {    addr_changed = true;  }  else  {    memcpy(output_buffer, udpaddr.output_buffer,	   sizeof(unsigned char) * OUTBUFF);    addr_changed = false;  }  return *this;}// assignment to another UdpAddress object overloadedUdpAddress& UdpAddress::operator=(const IpAddress &ipaddr){  ADDRESS_TRACE;  if (this == &ipaddr) return *this; // protect against assignment from itself  (IpAddress &)*this = ipaddr; // use ancestor assignment for ipaddr value  if (ip_version == version_ipv4)    smival.value.string.len = UDPIPLEN;  else    smival.value.string.len = UDPIP6LEN;  set_port(0);        // copy to port value  addr_changed = true;  return *this;}UdpAddress& UdpAddress::operator=(const char *inaddr){  ADDRESS_TRACE;  valid_flag = parse_address(inaddr);  addr_changed = true;  return *this;}//-----[ IP Address parse Address ]---------------------------------bool UdpAddress::parse_address(const char *inaddr){  ADDRESS_TRACE;  addr_changed = true;  char buffer[MAX_FRIENDLY_NAME];  unsigned short port = 0;  if (inaddr && (strlen(inaddr)< MAX_FRIENDLY_NAME))  {    strcpy(buffer, inaddr);    trim_white_space(buffer);  }  else  {    valid_flag = false;    return FALSE;  }  // look for port info @ the end of the string  // port can be delineated by a ':' or a '/'  // if neither are present then just treat it  // like a normal IpAddress  int remove_brackets = FALSE;  int found = FALSE;  int pos = (int)strlen(buffer) - 1; // safe to cast as max is MAX_FRIENDLY_NAME  int do_loop = TRUE;  int another_colon_found = FALSE;  if (pos < 0)  {    valid_flag = false;    return FALSE;  }  // search from the end, to find the start of the port   // [ipv4]:port [ipv4]/port ipv4/port ipv4:port [ipv4] ipv4  // [ipv6]:port [ipv6]/port ipv6/port           [ipv6] ipv6  while (do_loop)  {    if (buffer[pos] == '/')    {      found = TRUE;      sep='/';      if (buffer[pos -1] == ']')        remove_brackets = TRUE;      break;    }    if (buffer[pos] == ':')    {      if ((pos > 1) && (buffer[pos -1] == ']'))      {        found = TRUE;        remove_brackets = TRUE;        sep=':';        break;      }      for (int i=pos - 1; i >= 0 ; i--)        if (buffer[i] == ':')        {          another_colon_found = TRUE;        }      if (!another_colon_found)      {        sep=':';        found = TRUE;        break;      }    }    if (buffer[pos] == ']')    {      // we found a ] without following a port, so increase pos      ++pos;      remove_brackets = TRUE;      break;    }    pos--;    do_loop = ((found == FALSE) && (pos >= 0) &&               (another_colon_found == FALSE));  }  if (remove_brackets)  {    buffer[pos-1] = 0;    buffer[0] = ' ';  }  bool result;  if (found)  {    buffer[pos] = 0;    port = atoi(&buffer[pos+1]);    result = IpAddress::parse_address(buffer);  }  else  {    port = 0;    result = IpAddress::parse_address(buffer);  }  if (ip_version == version_ipv4)    smival.value.string.len = UDPIPLEN;  else    smival.value.string.len = UDPIP6LEN;  set_port(port);  return result;}//--------[ set the port number ]---------------------------------------void UdpAddress::set_port(const unsigned short p){  ADDRESS_TRACE;  unsigned short *port_nbo;  if (ip_version == version_ipv4)    port_nbo = (unsigned short*)(address_buffer + IPLEN);  else    port_nbo = (unsigned short*)(address_buffer + IP6LEN);  *port_nbo = htons(p);  addr_changed = true;}//---------[ get the port number ]--------------------------------------unsigned short UdpAddress::get_port() const{  ADDRESS_TRACE;  if (valid_flag)  {    unsigned short *port_nbo;    if (ip_version == version_ipv4)      port_nbo = (unsigned short*)(address_buffer + IPLEN);    else      port_nbo = (unsigned short*)(address_buffer + IP6LEN);    return ntohs(*port_nbo);  }  return 0;// don't use uninitialized memory}//----[ UDP address format output ]------------------------------------void UdpAddress::format_output() const{  ADDRESS_TRACE;  IpAddress::format_output(); // allow ancestors to format their buffers  // if valid format else null it  if (valid_flag)  {    if (ip_version == version_ipv4)      sprintf((char *) output_buffer,"%s%c%d",               IpAddress::get_printable(),               '/',//TODO:look for problems in old code and change to "sep"               get_port() );      else        sprintf((char *) output_buffer,"[%s]%c%d",                 IpAddress::get_printable(),                 '/',//TODO:look for problems in old code and change to "sep"                 get_port() );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?