⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockets.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 5 页
字号:
      return FALSE;    port = sa.GetPort();    return TRUE;  }#else  // attempt to listen  sockaddr_in sin;  memset(&sin, 0, sizeof(sin));  sin.sin_family      = AF_INET;  sin.sin_addr.s_addr = bindAddr;  sin.sin_port        = htons(port);       // set the port#ifdef __NUCLEUS_NET__  int bind_result;  if (port == 0)    bind_result = ::bindzero(os_handle, (struct sockaddr*)&sin, sizeof(sin));  else    bind_result = ::bind(os_handle, (struct sockaddr*)&sin, sizeof(sin));  if (ConvertOSError(bind_result))#else  if (ConvertOSError(::bind(os_handle, (struct sockaddr*)&sin, sizeof(sin))))#endif  {    socklen_t size = sizeof(sin);    if (ConvertOSError(::getsockname(os_handle, (struct sockaddr*)&sin, &size))) {      port = ntohs(sin.sin_port);      return TRUE;    }  }#endif  os_close();  return FALSE;}const PIPSocket::Address & PIPSocket::Address::GetLoopback(){  return loopback4;}#if P_HAS_IPV6/// Check for v4 mapped i nv6 address ::ffff:a.b.c.dBOOL PIPSocket::Address::IsV4Mapped() const{  if (version != 6)    return FALSE;  return IN6_IS_ADDR_V4MAPPED(&v.six) || IN6_IS_ADDR_V4COMPAT(&v.six);}const PIPSocket::Address & PIPSocket::Address::GetLoopback6(){  return loopback6;}const PIPSocket::Address & PIPSocket::Address::GetAny6(){  return any6;}#endifBOOL PIPSocket::Address::IsAny() const{  return (!IsValid());}const PIPSocket::Address & PIPSocket::Address::GetBroadcast(){  return broadcast4;}PIPSocket::Address::Address(){  *this = loopback4;}PIPSocket::Address::Address(const PString & dotNotation){  operator=(dotNotation);}PIPSocket::Address::Address(PINDEX len, const BYTE * bytes){  switch (len) {#if P_HAS_IPV6    case 16 :      version = 6;      memcpy(&v.six, bytes, len);      break;#endif    case 4 :      version = 4;      memcpy(&v.four, bytes, len);      break;    default :      version = 0;  }}PIPSocket::Address::Address(const in_addr & addr){  version = 4;  v.four = addr;}#if P_HAS_IPV6PIPSocket::Address::Address(const in6_addr & addr){  version = 6;  v.six = addr;}// Create an IP (v4 or v6) address from a sockaddr (sockaddr_in, sockaddr_in6 or sockaddr_in6_old) structurePIPSocket::Address::Address(const int ai_family, const int ai_addrlen, struct sockaddr *ai_addr){  switch (ai_family) {#if P_HAS_IPV6    case AF_INET6:      if (ai_addrlen < (int)sizeof(sockaddr_in6))        break;      version = 6;      v.six = ((struct sockaddr_in6 *)ai_addr)->sin6_addr;      //sin6_scope_id, should be taken into account for link local addresses      return;#endif    case AF_INET:       if (ai_addrlen < (int)sizeof(sockaddr_in))        break;      version = 4;      v.four = ((struct sockaddr_in  *)ai_addr)->sin_addr;      return;  }  version = 0;}#endif#ifdef __NUCLEUS_NET__PIPSocket::Address::Address(const struct id_struct & addr){  operator=(addr);}PIPSocket::Address & PIPSocket::Address::operator=(const struct id_struct & addr){  s_addr = (((unsigned long)addr.is_ip_addrs[0])<<24) +           (((unsigned long)addr.is_ip_addrs[1])<<16) +           (((unsigned long)addr.is_ip_addrs[2])<<8) +           (((unsigned long)addr.is_ip_addrs[3]));  return *this;}#endif PIPSocket::Address & PIPSocket::Address::operator=(const in_addr & addr){  version = 4;  v.four = addr;  return *this;}#if P_HAS_IPV6PIPSocket::Address & PIPSocket::Address::operator=(const in6_addr & addr){  version = 6;  v.six = addr;  return *this;}#endifPObject::Comparison PIPSocket::Address::Compare(const PObject & obj) const{  const PIPSocket::Address & other = (const PIPSocket::Address &)obj;  if (version < other.version)    return LessThan;  if (version > other.version)    return GreaterThan;#if P_HAS_IPV6  if (version == 6) {    int result = memcmp(&v.six, &other.v.six, sizeof(v.six));    if (result < 0)      return LessThan;    if (result > 0)      return GreaterThan;    return EqualTo;  }#endif  if ((DWORD)*this < other)    return LessThan;  if ((DWORD)*this > other)    return GreaterThan;  return EqualTo;}#if P_HAS_IPV6bool PIPSocket::Address::operator*=(const PIPSocket::Address & addr) const{  if (version == addr.version)    return operator==(addr);  if (this->GetVersion() == 6 && this->IsV4Mapped())     return PIPSocket::Address((*this)[12], (*this)[13], (*this)[14], (*this)[15]) == addr;  else if (addr.GetVersion() == 6 && addr.IsV4Mapped())     return *this == PIPSocket::Address(addr[12], addr[13], addr[14], addr[15]);  return FALSE;}bool PIPSocket::Address::operator==(in6_addr & addr) const{  PIPSocket::Address a(addr);  return Compare(a) == EqualTo;}#endifbool PIPSocket::Address::operator==(in_addr & addr) const{  PIPSocket::Address a(addr);  return Compare(a) == EqualTo;}bool PIPSocket::Address::operator==(DWORD dw) const{  if (dw != 0)    return (DWORD)*this == dw;  return !IsValid();}PIPSocket::Address & PIPSocket::Address::operator=(const PString & dotNotation){#if P_HAS_IPV6  struct addrinfo *res;  struct addrinfo hints = { AI_NUMERICHOST, PF_UNSPEC }; // Could be IPv4: x.x.x.x or IPv6: x:x:x:x::x    version = 0;  memset(&v, 0, sizeof(v));    if (getaddrinfo((const char *)dotNotation, NULL , &hints, &res) == 0) {    if (res->ai_family == PF_INET6) {      // IPv6 addr      version = 6;      struct sockaddr_in6 * addr_in6 = (struct sockaddr_in6 *)res->ai_addr;      v.six = addr_in6->sin6_addr;    } else {      // IPv4 addr      version = 4;      struct sockaddr_in * addr_in = (struct sockaddr_in *)res->ai_addr;      v.four = addr_in->sin_addr;    }    freeaddrinfo(res);  }#else //P_HAS_IPV6  if (::strspn(dotNotation, "0123456789.") < ::strlen(dotNotation))    *this = 0;  else {    version = 4;    v.four.s_addr = inet_addr((const char *)dotNotation);    if (v.four.s_addr == (DWORD)INADDR_NONE)      v.four.s_addr = 0;  }#endif  return *this;}PString PIPSocket::Address::AsString() const{#if P_HAS_IPV6  if (version == 6) {    PString str;    Psockaddr sa(*this, 0);    PAssertOS(getnameinfo(sa, sa.GetSize(), str.GetPointer(1024), 1024, NULL, 0, NI_NUMERICHOST) == 0);    PINDEX percent = str.Find('%'); // used for scoped address e.g. fe80::1%ne0, (ne0=network interface 0)    if (percent != P_MAX_INDEX)      str[percent] = '\0';    str.MakeMinimumSize();    return str;  }#endif#ifdef P_VXWORKS  char ipStorage[INET_ADDR_LEN];  inet_ntoa_b(v.four, ipStorage);  return ipStorage;    #else // P_VXWORKS  return inet_ntoa(v.four);#endif // P_VXWORKS}BOOL PIPSocket::Address::FromString(const PString & dotNotation){  (*this) = dotNotation;  return IsValid();}PIPSocket::Address::operator PString() const{  return AsString();}PIPSocket::Address::operator in_addr() const{  if (version != 4)    return inaddr_empty;  return v.four;}#if P_HAS_IPV6PIPSocket::Address::operator in6_addr() const{  if (version != 6)    return any6.v.six;  return v.six;}#endifBYTE PIPSocket::Address::operator[](PINDEX idx) const{  PASSERTINDEX(idx);#if P_HAS_IPV6  if (version == 6) {    PAssert(idx <= 15, PInvalidParameter);    return v.six.s6_addr[idx];  }#endif  PAssert(idx <= 3, PInvalidParameter);  return ((BYTE *)&v.four)[idx];}ostream & operator<<(ostream & s, const PIPSocket::Address & a){  return s << a.AsString();}ostream & operator<<(ostream & s, const PString & str){  return s << (const char *)str;}istream & operator>>(istream & s, PIPSocket::Address & a){/// Not IPv6 ready !!!!!!!!!!!!!  char dot1, dot2, dot3;  unsigned b1, b2, b3, b4;  s >> b1;  if (!s.fail()) {    if (s.peek() != '.')      a = htonl(b1);    else {      s >> dot1 >> b2 >> dot2 >> b3 >> dot3 >> b4;      if (!s.fail() && dot1 == '.' && dot2 == '.' && dot3 == '.')        a = PIPSocket::Address((BYTE)b1, (BYTE)b2, (BYTE)b3, (BYTE)b4);    }  }  return s;}PINDEX PIPSocket::Address::GetSize() const{  switch (version) {#if P_HAS_IPV6    case 6 :      return 16;#endif    case 4 :      return 4;  }  return 0;}BOOL PIPSocket::Address::IsValid() const{  switch (version) {#if P_HAS_IPV6    case 6 :      return memcmp(&v.six, &any6.v.six, sizeof(v.six)) != 0;#endif    case 4 :      return (DWORD)*this != INADDR_ANY;  }  return FALSE;}BOOL PIPSocket::Address::IsLoopback() const{#if P_HAS_IPV6  if (version == 6)    return IN6_IS_ADDR_LOOPBACK(&v.six);#endif  return *this == loopback4;}BOOL PIPSocket::Address::IsBroadcast() const{#if P_HAS_IPV6  if (version == 6) // In IPv6, no broadcast exist. Only multicast    return FALSE;#endif  return *this == broadcast4;}BOOL PIPSocket::Address::IsRFC1918() const { #if P_HAS_IPV6  if (version == 6) {    if (IN6_IS_ADDR_LINKLOCAL(&v.six) || IN6_IS_ADDR_SITELOCAL(&v.six))      return TRUE;    if (IsV4Mapped())      return PIPSocket::Address((*this)[12], (*this)[13], (*this)[14], (*this)[15]).IsRFC1918();  }#endif  return (Byte1() == 10)          ||          (            (Byte1() == 172)            &&            (Byte2() >= 16) && (Byte2() <= 31)          )          ||          (            (Byte1() == 192)             &&            (Byte2() == 168)          );}PIPSocket::InterfaceEntry::InterfaceEntry(const PString & _name,                                          const Address & _addr,                                          const Address & _mask,                                          const PString & _macAddr#if P_HAS_IPV6                                         ,const PString & _ip6Addr#endif                                         )  : name(_name.Trim()),    ipAddr(_addr),    netMask(_mask),    macAddr(_macAddr)#if P_HAS_IPV6    , ip6Addr(_ip6Addr)#endif{}void PIPSocket::InterfaceEntry::PrintOn(ostream & strm) const{  strm << ipAddr;#if P_HAS_IPV6  if (!ip6Addr)    strm << " [" << ip6Addr << ']';#endif  if (!macAddr)    strm << " <" << macAddr << '>';  if (!name)    strm << " (" << name << ')';}#ifdef __NUCLEUS_NET__BOOL PIPSocket::GetInterfaceTable(InterfaceTable & table){    InterfaceEntry *IE;    list<IPInterface>::iterator i;    for(i=Route4Configuration->Getm_IPInterfaceList().begin();            i!=Rout

⌨️ 快捷键说明

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