int NetworkedClient::receive(int timeout){ char buf[NETWORKED_MODULE_RECEIVE_BUFFER_SIZE]; Address remote; int size=socket.recvFrom(remote, buf, NETWORKED_MODULE_RECEIVE_BUFFER_SIZE, timeout); // std::cout << __PRETTY_FUNCTION__ << "begin" << std::endl; if (remote.getHost()==0xffffffff){ // std::cout << __PRETTY_FUNCTION__ << " broadcast HOST" << std::endl; elapsedTimeoutReceived(); return 0; } else { PeerInfoMap::iterator peer=peers.find(remote); if (peer==peers.end()){ PeerInfo pinfo; peers.insert(std::make_pair(remote,pinfo)); peer=peers.find(remote); std::cout << "registering supplier HOST= " <<remote.getHost() << " port=" << remote.getPort() <<std::endl; } gettimeofday(&peer->second.lastPingTime, 0); socket.sendTo(remote,"",0); // std::cout << "Parsing" << std::endl; if (size) parseMessage(size, buf); return size; } }
Address Resolver::resolve(const Address &cInfo) { string addrOut; const char *addr=cInfo.getHost().c_str(); if( strcmp(addr, "*")==0 ) // all addresses? addrOut="0.0.0.0"; // addr-any else { if( inet_addr(addr)==INADDR_NONE ) // non-IP? { // if everyting fails - try DNS: struct hostent *dns_info=gethostbyname(addr); if(dns_info==NULL || dns_info->h_addr_list[0]==NULL) // no match? throw Exception("Resolver::resolve(): unknown host '" + cInfo.getHost() + "'"); // choose first from the list... const in_addr *inAddr=reinterpret_cast<in_addr*>( dns_info->h_addr_list[0]); const char *tab =inet_ntoa(*inAddr); addrOut=string(tab); } else // if(non-IP) { // so this is a correct address! addrOut=cInfo.getHost(); }; }; // else(addr=="*") // returned resolved host info Address resolved(addrOut, cInfo.getPort() ); return resolved; };
bool addressComparator::operator ()(const Address &lhs, const Address &rhs) const { int i = lhs.getHost().compare(rhs.getHost()); if (i == 0) { return lhs.getPort() > rhs.getPort(); } return i > 0; }
int NetworkedSupplier::receive(int timeout){ char buf[NETWORKED_MODULE_RECEIVE_BUFFER_SIZE]; Address remote; int size=socket.recvFrom(remote, buf, NETWORKED_MODULE_RECEIVE_BUFFER_SIZE, timeout); if (remote.getHost()==0xffffffff) return 0; else { lockListener(); PeerInfoMap::iterator peer=peers.find(remote); if (peer==peers.end()){ struct PeerInfo pi; gettimeofday(&pi.lastPingTime,0); if (strstr(buf,"hello")!=0) { char *q = strrchr(buf,' '); pi.name= std::string(q+1); } else pi.name="NONAME"; peers.insert(std::make_pair(remote,pi)); std::cout << "inserting peer" << std::endl; } else { gettimeofday(&peer->second.lastPingTime, 0); } if (size) parseSupplierMessage(size, buf); unlockListener(); return size; } }
void multicastServer() { char buffer[6]; DgramSocket sock; Address client; cout << "Dgram multicast server: Start" << endl; sock.open(); sock.setReusePort(true); sock.bind(AnyAddress(23344)); sock.join(Address("224.0.0.50")); sock.join(Address("224.0.0.52")); sock.join(Address("224.0.0.53")); sock.leave(Address("224.0.0.52")); do { sock.recvFrom(buffer,6,client); sock.sendTo(buffer,6,client); cout << client.getHost() << " " << buffer << endl; } while(strcmp(buffer,"_END_")); sock.close(); cout << "Dgram multicast server: OK" << endl; }
int AddressCodec::calculateDataSize(const Address &address) { return ClientMessage::calculateDataSize(address.getHost()) + ClientMessage::INT32_SIZE; }
void AddressCodec::encode(const Address &address, ClientMessage &clientMessage) { clientMessage.set(address.getHost()); clientMessage.set((int32_t)address.getPort()); }