IpPort getIpPortFromSockAddr(const SockAddr &sa){ const int family = sa.getFamily(); if(family == AF_INET){ if(sa.getSize() < sizeof(::sockaddr_in)){ LOG_POSEIDON_WARNING("Invalid IPv4 SockAddr: size = ", sa.getSize()); DEBUG_THROW(Exception, sslit("Invalid IPv4 SockAddr")); } char ip[INET_ADDRSTRLEN]; const char *const str = ::inet_ntop(AF_INET, &static_cast<const ::sockaddr_in *>(sa.getData())->sin_addr, ip, sizeof(ip)); if(!str){ DEBUG_THROW(SystemException); } return IpPort(SharedNts(str), loadBe(static_cast<const ::sockaddr_in *>(sa.getData())->sin_port)); } else if(family == AF_INET6){ if(sa.getSize() < sizeof(::sockaddr_in6)){ LOG_POSEIDON_WARNING("Invalid IPv6 SockAddr: size = ", sa.getSize()); DEBUG_THROW(Exception, sslit("Invalid IPv6 SockAddr")); } char ip[INET6_ADDRSTRLEN]; const char *const str = ::inet_ntop(AF_INET6, &static_cast<const ::sockaddr_in6 *>(sa.getData())->sin6_addr, ip, sizeof(ip)); if(!str){ DEBUG_THROW(SystemException); } return IpPort(SharedNts(str), loadBe(static_cast<const ::sockaddr_in6 *>(sa.getData())->sin6_port)); } LOG_POSEIDON_WARNING("Unknown IP protocol ", family); DEBUG_THROW(Exception, sslit("Unknown IP protocol")); }
void CShdrEchoInstance::Init(std::string devicesxmlfilename, std::string shdrfilename, int ipport, double dOverride, std::string devicename) { DevicesXmlFilename()=devicesxmlfilename; ShdrFilename() =shdrfilename; IpAddress() ="127.0.0.1"; // really cant be anything else IpPort()=ipport; DeviceName() = devicename; Override()=dOverride; _bFaultThread=false; if(DevicesXmlFilename().empty()) DevicesXmlFilename()=ExeDirectory() + "devices.xml"; _bRepeat=true; _backend = new CoComMTCShdrBackEnd(); _backend->Init(_bstr_t(IpAddress().c_str()), IpPort(), _bstr_t(DeviceName().c_str())); _backend->MyLogger().AddListener(boost::bind(&CShdrEchoInstance::EchoShdr, this,_1)); _dict = _deviceparser.ReadDeviceDescription(DevicesXmlFilename()); std::string storemap,itemlist, typelist; int i=0; for(DataDictionary::iterator it = _dict.begin(); it!=_dict.end(); it++, i++) { if((*it).first.empty()) { i--; continue; } if(i>0) itemlist+=","; if(i>0) typelist+=","; storemap+=(*it).first+"="+(*it).first+"\n"; // isomorphic: alias = name itemlist+=(*it).first; typelist+=_dict[(*it).first]; } _backend->StoreTagMap(_bstr_t(storemap.c_str())); _backend->StoreTypeMap(_bstr_t(itemlist.c_str()),bstr_t(typelist.c_str())); Open(); _state=Ready; }