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

📄 netaddress.cpp

📁 流媒体传输协议的实现代码,非常有用.可以支持rtsp mms等流媒体传输协议
💻 CPP
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,59 Temple Place, Suite 330, Boston, MA  02111-1307  USA**********/// "mTunnel" multicast access service// Copyright (c) 1996-1998 Live Networks, Inc.  All rights reserved.// Network Addresses// Implementation#include "NetAddress.hh"#include "GroupsockHelper.hh"#include <stddef.h>#if defined(__WIN32__) || defined(_WIN32)#else#ifndef INADDR_NONE#define INADDR_NONE 0xFFFFFFFF#endif#endif////////// NetAddress //////////NetAddress::NetAddress(u_int8_t const* data, unsigned length) {  assign(data, length);}NetAddress::NetAddress(unsigned length) {  fData = new u_int8_t[length];  if (fData == NULL) {    fLength = 0;    return;  }  for (unsigned i = 0; i < length; ++i)	fData[i] = 0;  fLength = length;}NetAddress::NetAddress(NetAddress const& orig) {  assign(orig.data(), orig.length());}NetAddress& NetAddress::operator=(NetAddress const& rightSide) {  if (&rightSide != this) {    clean();    assign(rightSide.data(), rightSide.length());  }  return *this;}NetAddress::~NetAddress() {  clean();}void NetAddress::assign(u_int8_t const* data, unsigned length) {  fData = new u_int8_t[length];  if (fData == NULL) {    fLength = 0;    return;  }  for (unsigned i = 0; i < length; ++i)	fData[i] = data[i];  fLength = length;}void NetAddress::clean() {  delete[] fData; fData = NULL;  fLength = 0;}////////// NetAddressList //////////NetAddressList::NetAddressList(char const* hostname)  : fNumAddresses(0), fAddressArray(NULL) {    struct hostent* host;    // Check first whether "hostname" is an IP address string:    netAddressBits addr = our_inet_addr((char*)hostname);    if (addr != INADDR_NONE) { // yes it was an IP address string      //##### host = gethostbyaddr((char*)&addr, sizeof (netAddressBits), AF_INET);      host = NULL; // don't bother calling gethostbyaddr(); we only want 1 addr            if (host == NULL) {	// For some unknown reason, gethostbyaddr() failed, so just	// return a 1-element list with the address we were given:	fNumAddresses = 1;	fAddressArray = new NetAddress*[fNumAddresses];	if (fAddressArray == NULL) return;		fAddressArray[0] = new NetAddress((u_int8_t*)&addr,					  sizeof (netAddressBits));	return;      }    } else { // Try resolving "hostname" as a real host name#if defined(VXWORKS)      char hostentBuf[512];      host = (struct hostent*)resolvGetHostByName((char*)hostname,(char*)&hostentBuf,sizeof hostentBuf);#else      host = our_gethostbyname((char*)hostname);#endif      if (host == NULL) {	// It was a host name, and we couldn't resolve it.  We're SOL.	return;      }    }    u_int8_t const** const hAddrPtr      = (u_int8_t const**)host->h_addr_list;    if (hAddrPtr != NULL) {      // First, count the number of addresses:      u_int8_t const** hAddrPtr1 = hAddrPtr;      while (*hAddrPtr1 != NULL) {	++fNumAddresses;	++hAddrPtr1;      }            // Next, set up the list:      fAddressArray = new NetAddress*[fNumAddresses];      if (fAddressArray == NULL) return;            for (unsigned i = 0; i < fNumAddresses; ++i) {	fAddressArray[i]	  = new NetAddress(hAddrPtr[i], host->h_length);      }    }}NetAddressList::NetAddressList(NetAddressList const& orig) {  assign(orig.numAddresses(), orig.fAddressArray);}NetAddressList& NetAddressList::operator=(NetAddressList const& rightSide) {  if (&rightSide != this) {    clean();    assign(rightSide.numAddresses(), rightSide.fAddressArray);  }  return *this;}NetAddressList::~NetAddressList() {  clean();}void NetAddressList::assign(unsigned numAddresses, NetAddress** addressArray) {  fAddressArray = new NetAddress*[numAddresses];  if (fAddressArray == NULL) {    fNumAddresses = 0;    return;  }  for (unsigned i = 0; i < numAddresses; ++i) {    fAddressArray[i] = new NetAddress(*addressArray[i]);  }  fNumAddresses = numAddresses;}void NetAddressList::clean() {  while (fNumAddresses-- > 0) {    delete fAddressArray[fNumAddresses];  }  delete[] fAddressArray; fAddressArray = NULL;}NetAddress const* NetAddressList::firstAddress() const {  if (fNumAddresses == 0) return NULL;  return fAddressArray[0];}////////// NetAddressList::Iterator //////////NetAddressList::Iterator::Iterator(NetAddressList const& addressList)  : fAddressList(addressList), fNextIndex(0) {}NetAddress const* NetAddressList::Iterator::nextAddress() {  if (fNextIndex >= fAddressList.numAddresses()) return NULL; // no more  return fAddressList.fAddressArray[fNextIndex++];}////////// Port //////////Port::Port(portNumBits num /* in host byte order */) {  fPortNum = htons(num);}UsageEnvironment& operator<<(UsageEnvironment& s, const Port& p) {  return s << ntohs(p.num());}////////// AddressPortLookupTable //////////AddressPortLookupTable::AddressPortLookupTable()  : fTable(HashTable::create(3)) { // three-word keys are used}AddressPortLookupTable::~AddressPortLookupTable() {  delete fTable;}void* AddressPortLookupTable::Add(netAddressBits address1,				  netAddressBits address2,				  Port port, void* value) {  int key[3];  key[0] = (int)address1;  key[1] = (int)address2;  key[2] = (int)port.num();  return fTable->Add((char*)key, value);}void* AddressPortLookupTable::Lookup(netAddressBits address1,				     netAddressBits address2,				     Port port) {  int key[3];  key[0] = (int)address1;  key[1] = (int)address2;  key[2] = (int)port.num();  return fTable->Lookup((char*)key);}Boolean AddressPortLookupTable::Remove(netAddressBits address1,				       netAddressBits address2,				       Port port) {  int key[3];  key[0] = (int)address1;  key[1] = (int)address2;  key[2] = (int)port.num();  return fTable->Remove((char*)key);}AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable& table)  : fIter(HashTable::Iterator::create(*(table.fTable))) {}AddressPortLookupTable::Iterator::~Iterator() {  delete fIter;}void* AddressPortLookupTable::Iterator::next() {  char const* key; // dummy  return fIter->next(key);}////////// Misc. //////////Boolean IsMulticastAddress(netAddressBits address) {  // Note: We return False for addresses in the range 224.0.0.0  // through 224.0.0.255, because these are non-routable  // Note: IPv4-specific #####  netAddressBits addressInHostOrder = ntohl(address);  return addressInHostOrder >  0xE00000FF &&         addressInHostOrder <= 0xEFFFFFFF;}

⌨️ 快捷键说明

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