📄 sockets.cxx
字号:
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 + -