#include <unified_network.h>
Nevrax France
Definition at line 71 of file unified_network.h.
Public Member Functions | |
void | addCallbackArray (const TUnifiedCallbackItem *callbackarray, NLMISC::CStringIdArray::TStringId arraysize) |
void | addDefaultNetwork (const std::string &defnet) |
void | addNetworkAssociation (const std::string &networkName, uint8 nid) |
void | addService (const std::string &name, const std::vector< CInetAddress > &addr, bool sendId=true, bool external=true, uint16 sid=0, bool autoRetry=true, bool shouldBeAlreayInserted=false) |
void | addService (const std::string &name, const CInetAddress &addr, bool sendId=true, bool external=true, uint16 sid=0, bool autoRetry=true, bool shouldBeAlreayInserted=false) |
void | clearDefaultNetwork () |
Clear all default network. | |
void | clearNetworkAssociation () |
void | connect () |
void | displayInternalTables (NLMISC::CLog *log=NLMISC::InfoLog) |
void | displayUnifiedConnection (uint16 sid, NLMISC::CLog *log=NLMISC::InfoLog) |
TUnifiedMsgCallback | findCallback (const std::string &callbackName) |
Find a callback in the array. | |
uint64 | getBytesReceived () |
Gets the total number of bytes received. | |
uint64 | getBytesSent () |
Gets the total number of bytes sent. | |
const std::vector< uint16 > & | getConnectionList () const |
Return the service ids of the active connections. | |
CCallbackNetBase * | getNetBase (uint16 sid, TSockId &host, uint8 nid=0xFF) |
Gets the CCallbackNetBase of the service. | |
CCallbackNetBase * | getNetBase (const std::string &name, TSockId &host, uint8 nid=0xFF) |
Gets the CCallbackNetBase of the service. | |
uint64 | getReceiveQueueSize () |
Gets the total number of bytes queued after receiving. | |
uint64 | getSendQueueSize () |
Gets the total number of bytes queued for sending. | |
std::string | getServiceName (uint16 sid) |
Return the name of the specified service, or "" if not found. | |
std::string | getServiceUnifiedName (uint16 sid) |
Return a string identifying the service, using the format "NAME-sid" (or "sid" only if not found). | |
bool | init (const CInetAddress *addr, CCallbackNetBase::TRecordingState rec, const std::string &shortName, uint16 port, TServiceId &sid) |
bool | isServiceLocal (const std::string &serviceName) |
Returns true if the serviceName service is on the same computer than this service. | |
bool | isServiceLocal (uint16 sid) |
Returns true if the sid service is on the same computer than this service. | |
void | release () |
bool | send (uint16 serviceId, const CMessage &msg, uint8 nid=0xFF) |
bool | send (const std::string &serviceName, const CMessage &msg, uint8 nid=0xFF) |
void | sendAll (const CMessage &msg, uint8 nid=0xFF) |
void | setServiceDownCallback (const std::string &serviceName, TUnifiedNetCallback cb, void *arg=0, bool back=true) |
void | setServiceUpCallback (const std::string &serviceName, TUnifiedNetCallback cb, void *arg=0, bool back=true) |
void | update (NLMISC::TTime timeout=0) |
Static Public Member Functions | |
CUnifiedNetwork * | getInstance () |
bool | isUsed () |
Private Types | |
typedef std::pair< TUnifiedNetCallback, void * > | TCallbackArgItem |
A callback and its user data. | |
typedef std::map< std::string, TUnifiedMsgCallback > | TMsgMappedCallback |
A map of callbacks, refered by message name. | |
typedef std::hash_map< std::string, std::list< TCallbackArgItem > > | TNameMappedCallback |
A map of service up/down callbacks with their user data. | |
Private Member Functions | |
void | addNamedCnx (const std::string &name, uint16 sid) |
void | autoCheck () |
void | callServiceDownCallback (const std::string &serviceName, uint16 sid, bool callGlobalCallback=true) |
void | callServiceUpCallback (const std::string &serviceName, uint16 sid, bool callGlobalCallback=true) |
CUnifiedNetwork () | |
uint8 | findConnectionId (uint16 sid, uint8 nid) |
CUnifiedConnection * | getUnifiedConnection (uint16 sid, bool warn=true) |
bool | haveNamedCnx (const std::string &name, uint16 sid) |
void | removeNamedCnx (const std::string &name, uint16 sid) |
~CUnifiedNetwork () | |
Private Attributes | |
TMsgMappedCallback | _Callbacks |
Map of callbacks. | |
CCallbackServer * | _CbServer |
The callback server. | |
std::vector< std::string > | _DefaultNetwork |
for each services, which network to take | |
TNameMappedCallback | _DownCallbacks |
std::vector< TCallbackArgItem > | _DownUniCallback |
uint16 | _ExtSId |
Used for external service. | |
std::vector< CUnifiedConnection > | _IdCnx |
Vector of connections by service id (sid is the entry in this array, it means that there s some hole). | |
bool | _Initialised |
true if initialisation function called | |
NLMISC::TTime | _LastRetry |
Last time of retry. | |
std::string | _Name |
Service name. | |
TNameMappedConnection | _NamedCnx |
Map of connections by service name. | |
NLNET::CInetAddress | _NamingServiceAddr |
Naming service. | |
std::vector< uint32 > | _NetworkAssociations |
for each nid, which network address | |
NLMISC::TTime | _NextUpdateTime |
Time of the theorical next update. | |
CCallbackNetBase::TRecordingState | _RecordingState |
Recording state. | |
uint16 | _ServerPort |
The server port. | |
TServiceId | _SId |
Service id of the running service. | |
TNameMappedCallback | _UpCallbacks |
Map of the up/down service callbacks. | |
std::vector< TCallbackArgItem > | _UpUniCallback |
std::vector< uint16 > | _UsedConnection |
This vector contains only an index to the unified connection. It is used to have quick access on the available connections. | |
Static Private Attributes | |
CUnifiedNetwork * | _Instance = NULL |
The main instance. | |
Friends | |
struct | isServiceLocalClass |
struct | l5CallbackClass |
struct | l5QueuesStatsClass |
void | uncbConnection (TSockId from, void *arg) |
void | uncbDisconnection (TSockId from, void *arg) |
void | uncbMsgProcessing (CMessage &msgin, TSockId from, CCallbackNetBase &netbase) |
void | uncbServiceIdentification (CMessage &msgin, TSockId from, CCallbackNetBase &netbase) |
void | uNetRegistrationBroadcast (const std::string &name, TServiceId sid, const std::vector< CInetAddress > &addr) |
void | uNetUnregistrationBroadcast (const std::string &name, TServiceId sid, const std::vector< CInetAddress > &addr) |
|
A callback and its user data.
Definition at line 245 of file unified_network.h. |
|
A map of callbacks, refered by message name.
Definition at line 242 of file unified_network.h. |
|
A map of service up/down callbacks with their user data.
Definition at line 248 of file unified_network.h. |
|
Definition at line 481 of file unified_network.h. References _CbServer, _ExtSId, and _LastRetry. Referenced by getInstance().
00481 : _CbServer(0), _ExtSId(256), _LastRetry(0), _NextUpdateTime(0), _Initialised(false) 00482 { 00483 } |
|
Definition at line 485 of file unified_network.h.
00485 { } |
|
Adds a callback array in the system. You can add callback only *after* adding the server, the client or the group. Definition at line 1188 of file unified_network.cpp. References _Callbacks, NLMISC::CStringIdArray::TStringId, and uint. Referenced by NLNET::IService::main().
01189 { 01190 uint i; 01191 01192 for (i=0; i<(uint)arraysize; ++i) 01193 _Callbacks.insert(make_pair(string(callbackarray[i].Key),callbackarray[i].Callback)); 01194 } |
|
This array says to wich network we need to send the message for the default nid. For example you can says that message for AES will use the network 0 and message for LS will use the network 1. To do that, just call the function with string "AES0" and "LS1" the number is the nid (look at addNetworkAssociation()) addNetworkAssociation("192.168.0.0", 0); addNetworkAssociation("192.168.1.0", 1); In this case if you send a message to AES with default nid, it'll be send to 192.168.0.x In this case if you send a message to LS with default nid, it'll be send to 192.168.1.y Definition at line 184 of file unified_network.h. References _DefaultNetwork, and nlinfo.
00184 { nlinfo ("HNETL5: Add default network '%s'", defnet.c_str()); _DefaultNetwork.push_back (defnet); } |
|
Definition at line 1700 of file unified_network.cpp. References _NamedCnx, NLNET::allstuffs, AUTOCHECK_DISPLAY, range, NLMISC::toString(), and uint16. Referenced by addService(), NLNET::uncbServiceIdentification(), and update().
01701 { 01702 // check if not already inserted 01703 CUnifiedNetwork::TNameMappedConnection::iterator it; 01704 pair<CUnifiedNetwork::TNameMappedConnection::iterator,CUnifiedNetwork::TNameMappedConnection::iterator> range; 01705 range = _NamedCnx.equal_range(name); 01706 01707 if (range.first != range.second) 01708 { 01709 for (it=range.first; it!=range.second && (*it).second!=sid; ++it) 01710 ; 01711 01712 if (it != range.second) 01713 { 01714 AUTOCHECK_DISPLAY ("HNETL5: Try to add 2 times the same connection %s-%hu", name.c_str(), sid); 01715 return; 01716 } 01717 } 01718 01719 01720 // insert the name in the map to be able to send message with the name 01721 _NamedCnx.insert(make_pair(name, sid)); 01722 01723 allstuffs += "+name "+name+"-"+toString(sid)+"\n"; 01724 test.displayNL ("+name %s-%hu", name.c_str (), sid); 01725 } |
|
Associate a string with a network id If the send don't set a specific nid, it ll use the 0, so be sure that the nid 0 is set to a network. You must call this function before the connect() function.
Definition at line 1759 of file unified_network.cpp. References _NetworkAssociations, NLNET::internalIPAddressToString(), nlinfo, NLNET::stringToInternalIPAddress(), uint16, and uint8.
01760 { 01761 if (nid >= _NetworkAssociations.size ()) 01762 _NetworkAssociations.resize (nid+1, 0xFF); 01763 01764 _NetworkAssociations[nid] = stringToInternalIPAddress (networkName); 01765 nlinfo ("HNETL5: Associate network '%s' 0x%08x '%s' to nid %hu", networkName.c_str(), _NetworkAssociations[nid], internalIPAddressToString (_NetworkAssociations[nid]).c_str(), (uint16)nid); 01766 } |
|
Definition at line 653 of file unified_network.cpp. References _DefaultNetwork, _ExtSId, _IdCnx, _NetworkAssociations, _UsedConnection, addNamedCnx(), addr, NLNET::allstuffs, AUTOCHECK_DISPLAY, NLNET::CUnifiedNetwork::CUnifiedConnection::AutoRetry, callServiceUpCallback(), NLNET::CCallbackClient::connect(), NLNET::CUnifiedNetwork::CUnifiedConnection::Connection, NLNET::CUnifiedNetwork::CUnifiedConnection::ExtAddress, NLNET::CCallbackClient::getSockId(), NLMISC::getThreadId(), NLNET::CUnifiedNetwork::CUnifiedConnection::IsExternal, nlassert, nlassertex, nldebug, nlinfo, nlwarning, NLNET::CCallbackClient::send(), NLNET::CUnifiedNetwork::CUnifiedConnection::SendId, NLMISC::CMemStream::serial(), NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceId, NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceName, NLNET::CBufSock::setAppId(), NLNET::CCallbackNetBase::setDefaultCallback(), NLNET::CCallbackClient::setDisconnectionCallback(), NLNET::CUnifiedNetwork::CUnifiedConnection::setupNetworkAssociation(), NLNET::CUnifiedNetwork::CUnifiedConnection::State, NLNET::ThreadCreator, NLMISC::toString(), uint, uint16, uint8, NLNET::uncbDisconnection(), NLNET::uncbMsgProcessing(), and NLNET::vectorCInetAddressToString().
00654 { 00655 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::addService() whereas it is not initialised yet")); 00656 00657 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 00658 00659 if (external) 00660 sid = _ExtSId++; 00661 00662 nlinfo("HNETL5: addService %s-%hu '%s'", name.c_str(), sid, vectorCInetAddressToString(addr).c_str()); 00663 00664 allstuffs += "addService "+name+"-"+toString(sid)+"\n"; 00665 test.displayNL ("+service %s-%hu", name.c_str (), (uint16)sid); 00666 00667 if (external && addr.size () != 1) 00668 { 00669 AUTOCHECK_DISPLAY ("HNETL5: Can't add external service with more than one connection"); 00670 } 00671 00672 // add the entry in the unified connection table 00673 00674 if (sid >= _IdCnx.size()) 00675 _IdCnx.resize(sid+1); 00676 00677 CUnifiedConnection *uc = &_IdCnx[sid]; 00678 00679 // at this point it s possible that the service already added in the _IdCnx by the uNetRegistrationBroadcast() 00680 00681 if (shouldBeAlreayInserted && _IdCnx[sid].State == CUnifiedNetwork::CUnifiedConnection::NotUsed) AUTOCHECK_DISPLAY ("HNETL5: the unified connection should already set by the naming reg broadcast and is not (%hu)", sid); 00682 if (!shouldBeAlreayInserted && _IdCnx[sid].State == CUnifiedNetwork::CUnifiedConnection::Ready) AUTOCHECK_DISPLAY ("HNETL5: the unified connection should not already set but is (%hu)", sid); 00683 00684 if (_IdCnx[sid].State == CUnifiedNetwork::CUnifiedConnection::NotUsed) 00685 { 00686 *uc = CUnifiedConnection(name, sid, external); 00687 _UsedConnection.push_back (sid); 00688 } 00689 else 00690 { 00691 // If the entry already set, check that all is correct 00692 if (name != uc->ServiceName) AUTOCHECK_DISPLAY ("HNETL5: name are different in addService %s %s", name.c_str (), uc->ServiceName.c_str ()); 00693 if (sid != uc->ServiceId) AUTOCHECK_DISPLAY ("HNETL5: sid are different in addService %hu %hu", sid, uc->ServiceId); 00694 if (addr != uc->ExtAddress) AUTOCHECK_DISPLAY ("HNETL5: external addr are different in addService '%s' '%s'", vectorCInetAddressToString(addr).c_str(), vectorCInetAddressToString(uc->ExtAddress).c_str ()); 00695 } 00696 uc->AutoRetry = autoRetry; 00697 uc->SendId = sendId; 00698 uc->ExtAddress = addr; 00699 nlassert (!addr.empty()); 00700 00701 // associate nid with ext address 00702 uc->setupNetworkAssociation (_NetworkAssociations, _DefaultNetwork); 00703 00704 // connect to all connection 00705 bool connectSuccess; 00706 00707 if (uc->Connection.size () < addr.size ()) 00708 { 00709 uc->Connection.resize (addr.size ()); 00710 } 00711 00712 vector<CInetAddress> laddr = CInetAddress::localAddresses(); 00713 00714 for (uint i = 0; i < addr.size(); i++) 00715 { 00716 // first we have to look if we have a network that can established the connection 00717 00718 uint j = 0; 00719 // it s 127.0.0.1, it s ok 00720 if (!addr[i].is127001 ()) 00721 { 00722 for (j = 0; j < laddr.size (); j++) 00723 { 00724 if (laddr[j].internalNetAddress () == addr[i].internalNetAddress ()) 00725 { 00726 // it's ok, we can try 00727 break; 00728 } 00729 } 00730 00731 // If we don't found a valid network, we'll try with the first one. 00732 // It's happen, for example, when you try to connect to a service that is not in the network but use IP translation 00733 if (j == laddr.size ()) 00734 { 00735 nlwarning ("HNETL5: I can't access '%s' because I haven't a net card on this network, we'll use the first network", addr[i].asString ().c_str ()); 00736 j = 0; 00737 } 00738 } 00739 00740 // create a new connection with the service, setup callback and connect 00741 CCallbackClient *cbc = new CCallbackClient(); 00742 cbc->setDisconnectionCallback(uncbDisconnection, NULL); 00743 cbc->setDefaultCallback(uncbMsgProcessing); 00744 cbc->getSockId()->setAppId(sid); 00745 00746 try 00747 { 00748 cbc->connect(addr[i]); 00749 connectSuccess = true; 00750 00751 allstuffs += "+lconnect "+name+"-"+toString(sid)+"\n"; 00752 test.displayNL ("+lconnect %s-%hu", name.c_str (), (uint16)sid); 00753 } 00754 catch (ESocketConnectionFailed &e) 00755 { 00756 nlwarning ("HNETL5: can't connect to %s (sid %u) now (%s) '%s'", name.c_str(), sid, e.what (), addr[i].asString ().c_str()); 00757 connectSuccess = false; 00758 00759 allstuffs += "+lconnect failed "+name+"-"+toString((uint16)sid)+"\n"; 00760 test.displayNL ("+lconnect failed %s-%hu", name.c_str (), (uint16)sid); 00761 } 00762 00763 if (!connectSuccess && !autoRetry) 00764 { 00765 nlwarning ("HNETL5: Can't add service because no retry and can't connect"); 00766 delete cbc; 00767 } 00768 else 00769 { 00770 uc->Connection[i] = CUnifiedNetwork::CUnifiedConnection::TConnection(cbc); 00771 00772 // nlinfo ("HNETL5: %s", allstuffs.c_str ()); 00773 } 00774 00775 if (connectSuccess && sendId) 00776 { 00777 // send identification to the service 00778 CMessage msg("UN_SIDENT"); 00779 msg.serial(_Name); 00780 uint16 ssid = _SId; 00781 if (uc->IsExternal) 00782 { 00783 // in the case that the service is external, we can't send our sid because the external service can 00784 // have other connectin with the same sid (for example, LS can have 2 WS with same sid => sid = 0 and leave 00785 // the other side to find a good number 00786 ssid = 0; 00787 } 00788 msg.serial(ssid); // serializes a 16 bits service id 00789 uint8 pos = j; 00790 msg.serial(pos); // send the position in the connection table 00791 msg.serial (uc->IsExternal); 00792 cbc->send (msg); 00793 } 00794 } 00795 00796 if (addr.size () != uc->Connection.size()) 00797 { 00798 nlwarning ("HNETL5: Can't connect to all connections to the service %d/%d", addr.size (), uc->Connection.size()); 00799 } 00800 00801 bool cntok = false; 00802 for (uint j = 0; j < uc->Connection.size(); j++) 00803 { 00804 if (uc->Connection[j].CbNetBase != NULL) 00805 { 00806 if (uc->Connection[j].CbNetBase->connected ()) 00807 { 00808 cntok = true; 00809 break; 00810 } 00811 } 00812 } 00813 00814 if (cntok) 00815 { 00816 // add the name only if at least one connection is ok 00817 addNamedCnx (name, sid); 00818 00819 callServiceUpCallback (name, sid, !external); 00820 00821 /* 00822 // call the connection callback associated to this service 00823 TNameMappedCallback::iterator itcb = _UpCallbacks.find(name); 00824 if (itcb != _UpCallbacks.end()) 00825 { 00826 for (list<TCallbackArgItem> it2 = (*itcb).second.begin(); it2 != (*itcb).second.end(); it2++) 00827 { 00828 TUnifiedNetCallback cb = (*it2).first; 00829 if (cb) cb(name, sid, (*it2).second); 00830 } 00831 } 00832 00833 if (!external) 00834 { 00835 for (uint i = 0; i < _UpUniCallback.size (); i++) 00836 { 00837 if (_UpUniCallback[i].first != NULL) 00838 _UpUniCallback[i].first (name, sid, _UpUniCallback[i].second); 00839 } 00840 } 00841 */ } 00842 00843 nldebug ("HNETL5: addService was successful"); 00844 } |
|
Adds a specific service to the list of connected services. Definition at line 646 of file unified_network.cpp. Referenced by connect().
00647 { 00648 vector <CInetAddress> addrs; 00649 addrs.push_back (addr); 00650 addService (name, addrs, sendId, external, sid, autoRetry, shouldBeAlreayInserted); 00651 } |
|
Definition at line 1517 of file unified_network.cpp. References _IdCnx, _NamedCnx, _NetworkAssociations, _UsedConnection, AUTOCHECK_DISPLAY, H_AUTO, NL_I64, and uint. Referenced by update().
01518 { 01519 H_AUTO(L5UpdateAutoCheck); 01520 uint i, j; 01521 01522 for (i = 0; i < _IdCnx.size (); i++) 01523 { 01524 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01525 { 01526 _IdCnx[i].AutoCheck = 1; 01527 } 01528 else 01529 { 01530 _IdCnx[i].AutoCheck = 0; 01531 } 01532 } 01533 01534 TNameMappedConnection::iterator itn; 01535 for (itn = _NamedCnx.begin(); itn != _NamedCnx.end(); ++itn) 01536 { 01537 if ((*itn).first != _IdCnx[(*itn).second].ServiceName) AUTOCHECK_DISPLAY ("HLNET5: problem with name syncro between _NameCnx and _IdCnx '%s' '%s' '%d'", (*itn).first.c_str(), _IdCnx[(*itn).second].ServiceName.c_str (), (*itn).second); 01538 if (_IdCnx[(*itn).second].AutoCheck == 0) AUTOCHECK_DISPLAY ("HLNET5: problem with name syncro between _NameCnx '%s' and _IdCnx '%s' '%d'", (*itn).first.c_str(), _IdCnx[(*itn).second].ServiceName.c_str (), (*itn).second); 01539 if (_IdCnx[(*itn).second].AutoCheck > 1) AUTOCHECK_DISPLAY ("HLNET5: problem with name syncro between _NameCnx and _IdCnx '%s' '%d' more than one entry in named with the same name", (*itn).first.c_str(), _IdCnx[(*itn).second].ServiceName.c_str (),(*itn).second); 01540 _IdCnx[(*itn).second].AutoCheck++; 01541 } 01542 01543 for (i = 0; i < _UsedConnection.size (); i++) 01544 { 01545 if (_IdCnx[_UsedConnection[i]].State != CUnifiedNetwork::CUnifiedConnection::Ready) AUTOCHECK_DISPLAY ("HLNET5: problem with the _UsedConnection syncro sid %d is not used in _IdCnx", _UsedConnection[i]); 01546 } 01547 01548 for (i = 0; i < _IdCnx.size (); i++) 01549 { 01550 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01551 { 01552 for (j = 0; j < _UsedConnection.size (); j++) 01553 { 01554 if (_UsedConnection[j] == i) break; 01555 } 01556 if (j == _UsedConnection.size ()) AUTOCHECK_DISPLAY ("HLNET5: problem with the _UsedConnection syncro sid %d is not in _UsedConnection", i); 01557 } 01558 } 01559 01560 for (i = 0; i < _IdCnx.size (); i++) 01561 { 01562 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::NotUsed) 01563 { 01564 if (_IdCnx[i].ServiceName != "DEAD") AUTOCHECK_DISPLAY ("HLNET5: sid %d name should be DEAD and is '%s'", i, _IdCnx[i].ServiceName.c_str ()); 01565 if (_IdCnx[i].ServiceId != 0xDEAD) AUTOCHECK_DISPLAY ("HLNET5: sid %d sid should be 0xDEAD and is 0x%X", i, _IdCnx[i].ServiceId); 01566 if (!_IdCnx[i].Connection.empty ()) AUTOCHECK_DISPLAY ("HLNET5: sid %d connection size should be 0 and is %d", i, _IdCnx[i].Connection.size ()); 01567 if (!_IdCnx[i].ExtAddress.empty ()) AUTOCHECK_DISPLAY ("HLNET5: sid %d ext addr size should be 0 and is %d", i, _IdCnx[i].ExtAddress.size ()); 01568 if (_IdCnx[i].AutoCheck != 0) AUTOCHECK_DISPLAY ("HLNET5: sid %d prob with syncro with _NamedCnx", i); 01569 } 01570 else if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01571 { 01572 if (_IdCnx[i].ServiceId != i) AUTOCHECK_DISPLAY ("HNETL5: Bad syncro sid index sid entry for %d %d", i, _IdCnx[i].ServiceId); 01573 01574 if (_IdCnx[i].ServiceName == "DEAD") AUTOCHECK_DISPLAY ("HLNET5: sid %d name should not be DEAD and is '%s'", i, _IdCnx[i].ServiceName.c_str ()); 01575 if (_IdCnx[i].ServiceId == 0xDEAD) AUTOCHECK_DISPLAY ("HLNET5: sid %d sid should not be 0xDEAD and is 0x%X", i, _IdCnx[i].ServiceId); 01576 if (!_IdCnx[i].ExtAddress.empty () && _IdCnx[i].Connection.size () > _IdCnx[i].ExtAddress.size()) AUTOCHECK_DISPLAY ("HLNET5: sid %d ext addr size should not be 0 and is %d", i, _IdCnx[i].ExtAddress.size ()); 01577 01578 if (_IdCnx[i].AutoRetry == true && _IdCnx[i].Connection.size () > 1) AUTOCHECK_DISPLAY ("HLNET5: sid %d auto retry with more than one connection %d", i, _IdCnx[i].Connection.size ()); 01579 if (_IdCnx[i].AutoRetry == true && _IdCnx[i].IsExternal == false) AUTOCHECK_DISPLAY ("HLNET5: sid %d auto retry with internal connection", i); 01580 if (_IdCnx[i].AutoRetry == true && _IdCnx[i].Connection[0].valid() == false) AUTOCHECK_DISPLAY ("HLNET5: sid %d auto retry with invalid connection", i); 01581 01582 for (j = 0; j < _IdCnx[i].Connection.size (); j++) 01583 { 01584 if (_IdCnx[i].Connection[j].valid() && !_IdCnx[i].Connection[j].IsServerConnection && _IdCnx[i].Connection[j].CbNetBase->connected () && _IdCnx[i].Connection[j].getAppId() != i) AUTOCHECK_DISPLAY ("HLNET5: sid %d bad appid %"NL_I64"X", i, _IdCnx[i].Connection[j].getAppId()); 01585 } 01586 01587 for (j = 0; j < _IdCnx[i].NetworkConnectionAssociations.size (); j++) 01588 { 01589 if (_IdCnx[i].NetworkConnectionAssociations[j] != 0) 01590 { 01591 if (_NetworkAssociations[j] != _IdCnx[i].ExtAddress[_IdCnx[i].NetworkConnectionAssociations[j]].internalNetAddress ()) AUTOCHECK_DISPLAY ("HLNET5: sid %d nid %d have address 0x%08x and is not the good connection net 0x%08x", i, j, _NetworkAssociations[j], _IdCnx[i].ExtAddress[_IdCnx[i].NetworkConnectionAssociations[j]].internalNetAddress ()); 01592 } 01593 } 01594 } 01595 } 01596 } |
|
Definition at line 1797 of file unified_network.cpp. References _DownCallbacks, _DownUniCallback, nlwarning, NLNET::TUnifiedNetCallback, uint, and uint16. Referenced by NLNET::uncbDisconnection(), and NLNET::uNetUnregistrationBroadcast().
01798 { 01799 // now we warn the user 01800 CUnifiedNetwork::TNameMappedCallback::iterator it = _DownCallbacks.find(serviceName); 01801 if (it != _DownCallbacks.end()) 01802 { 01803 // call it 01804 for (list<TCallbackArgItem>::iterator it2 = (*it).second.begin(); it2 != (*it).second.end(); it2++) 01805 { 01806 TUnifiedNetCallback cb = (*it2).first; 01807 if (cb) 01808 cb(serviceName, sid, (*it2).second); 01809 else 01810 nlwarning ("HNETL5: User set an empty callback for '%s' service down", serviceName.c_str()); 01811 } 01812 } 01813 01814 if(callGlobalCallback) 01815 { 01816 for (uint c = 0; c < _DownUniCallback.size (); c++) 01817 { 01818 if (_DownUniCallback[c].first != NULL) 01819 _DownUniCallback[c].first (serviceName, sid, _DownUniCallback[c].second); 01820 else 01821 nlwarning ("HNETL5: User set an empty callback for '*' service down"); 01822 } 01823 } 01824 } |
|
Definition at line 1768 of file unified_network.cpp. References _UpCallbacks, _UpUniCallback, nlwarning, NLNET::TUnifiedNetCallback, uint, and uint16. Referenced by addService(), NLNET::uncbServiceIdentification(), and update().
01769 { 01770 // now we warn the user 01771 CUnifiedNetwork::TNameMappedCallback::iterator it = _UpCallbacks.find(serviceName); 01772 if (it != _UpCallbacks.end()) 01773 { 01774 // call it 01775 for (list<TCallbackArgItem>::iterator it2 = (*it).second.begin(); it2 != (*it).second.end(); it2++) 01776 { 01777 TUnifiedNetCallback cb = (*it2).first; 01778 if (cb) 01779 cb(serviceName, sid, (*it2).second); 01780 else 01781 nlwarning ("HNETL5: User set an empty callback for '%s' service up", serviceName.c_str()); 01782 } 01783 } 01784 01785 if(callGlobalCallback) 01786 { 01787 for (uint c = 0; c < _UpUniCallback.size (); c++) 01788 { 01789 if (_UpUniCallback[c].first != NULL) 01790 _UpUniCallback[c].first (serviceName, sid, _UpUniCallback[c].second); 01791 else 01792 nlwarning ("HNETL5: User set an empty callback for '*' service up"); 01793 } 01794 } 01795 } |
|
Clear all default network.
Definition at line 187 of file unified_network.h. References _DefaultNetwork.
00187 { _DefaultNetwork.clear (); } |
|
Clear all network association Definition at line 175 of file unified_network.h. References _NetworkAssociations.
00175 { _NetworkAssociations.clear (); } |
|
Registers to the Naming Service, and connects to the present services Definition at line 566 of file unified_network.cpp. References addService(), NLMISC::getThreadId(), nlassertex, nlwarning, and NLNET::ThreadCreator.
00567 { 00568 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::connect() whereas it is not initialised yet")); 00569 00570 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 00571 00572 00573 if (CNamingClient::connected()) 00574 { 00575 // get the services list 00576 const list<CNamingClient::CServiceEntry> &services = CNamingClient::getRegisteredServices(); 00577 00578 // connects to the registered services 00579 list<CNamingClient::CServiceEntry>::const_iterator its; 00580 00581 // don't connect to itself 00582 for (its = services.begin(); its != services.end(); ++its) 00583 { 00584 if (_SId != (*its).SId) 00585 { 00586 // add service with name, address, ident, not external, service id, and not autoretry (obsolete) 00587 // we put the last true because the name callback should already inserted it by uNetRegistrationBroadcast() 00588 addService((*its).Name, (*its).Addr, true, false, (*its).SId, false, true); 00589 } 00590 else 00591 { 00592 // don't process services received after mine because they'll connect to me 00593 break; 00594 } 00595 } 00596 } 00597 } |
|
Definition at line 1599 of file unified_network.cpp. References _IdCnx, _NamedCnx, _NetworkAssociations, _UsedConnection, NLMISC::CLog::displayNL(), NLNET::internalIPAddressToString(), uint, and uint16. Referenced by NLNET::NLMISC_COMMAND().
01600 { 01601 uint i, j; 01602 log->displayNL ("%d Named Connections:", _NamedCnx.size ()); 01603 for (TNameMappedConnection::iterator it = _NamedCnx.begin(); it != _NamedCnx.end (); it++) 01604 { 01605 log->displayNL ("> '%s' -> %hu", (*it).first.c_str(), (*it).second); 01606 } 01607 01608 uint nbused = 0; 01609 for (i = 0; i < _IdCnx.size (); i++) 01610 { 01611 if(_IdCnx[i].State != CUnifiedNetwork::CUnifiedConnection::NotUsed) 01612 nbused++; 01613 } 01614 01615 log->displayNL ("%u/%u Unified Connections:", nbused, _IdCnx.size ()); 01616 for (i = 0; i < _IdCnx.size (); i++) 01617 { 01618 if(_IdCnx[i].State != CUnifiedNetwork::CUnifiedConnection::NotUsed) 01619 { 01620 /* log->displayNL ("> %s-%hu %s %s %s (%d extaddr %d cnx) tcbc %d", _IdCnx[i].ServiceName.c_str (), _IdCnx[i].ServiceId, _IdCnx[i].IsExternal?"ext":"int", _IdCnx[i].AutoRetry?"autoretry":"noautoretry", _IdCnx[i].SendId?"sendid":"nosendid", _IdCnx[i].ExtAddress.size (), _IdCnx[i].Connection.size (), _IdCnx[i].TotalCallbackCalled); 01621 uint maxc = _IdCnx[i].Connection.size (); 01622 if(_IdCnx[i].Connection.size () <= _IdCnx[i].ExtAddress.size ()) 01623 maxc = _IdCnx[i].ExtAddress.size (); 01624 01625 for (j = 0; j < maxc; j++) 01626 { 01627 string base; 01628 if(j < _IdCnx[i].ExtAddress.size ()) 01629 { 01630 base += _IdCnx[i].ExtAddress[j].asString (); 01631 } 01632 else 01633 { 01634 base += "notvalid"; 01635 } 01636 01637 string ext; 01638 if(j < _IdCnx[i].Connection.size () && _IdCnx[i].Connection[j].valid()) 01639 { 01640 if(_IdCnx[i].Connection[j].IsServerConnection) 01641 { 01642 ext += "server "; 01643 } 01644 else 01645 { 01646 ext += "client "; 01647 } 01648 ext += _IdCnx[i].Connection[j].CbNetBase->getSockId (_IdCnx[i].Connection[j].HostId)->asString (); 01649 ext += " appid:" + toString(_IdCnx[i].Connection[j].getAppId()); 01650 if (_IdCnx[i].Connection[j].CbNetBase->connected ()) 01651 ext += " connected"; 01652 else 01653 ext += " notconnected"; 01654 } 01655 else 01656 { 01657 ext += "notvalid"; 01658 } 01659 01660 log->displayNL (" - %s %s", base.c_str (), ext.c_str ()); 01661 }*/ 01662 01663 _IdCnx[i].display (false, log); 01664 for (j = 0; j < _IdCnx[i].NetworkConnectionAssociations.size (); j++) 01665 { 01666 log->displayNL (" * nid %d -> cnxn %hu", j, (uint16)_IdCnx[i].NetworkConnectionAssociations[j]); 01667 } 01668 } 01669 } 01670 01671 log->displayNL ("%u Used Unified Connections:", _UsedConnection.size()); 01672 for (i = 0; i < _UsedConnection.size (); i++) 01673 { 01674 log->displayNL ("> %hu", _UsedConnection[i]); 01675 } 01676 01677 log->displayNL ("%u Network Associations:", _NetworkAssociations.size()); 01678 for (i = 0; i < _NetworkAssociations.size (); i++) 01679 { 01680 log->displayNL ("> 0x%08x -> '%s'", _NetworkAssociations[i], internalIPAddressToString (_NetworkAssociations[i]).c_str ()); 01681 } 01682 } |
|
Definition at line 231 of file unified_network.h. References NLNET::CUnifiedNetwork::CUnifiedConnection::display(), getUnifiedConnection(), and uint16.
00232 { 00233 getUnifiedConnection(sid)->display(false, log); 00234 } |
|
Find a callback in the array.
Definition at line 1393 of file unified_network.cpp. References _Callbacks, and NLNET::TUnifiedMsgCallback. Referenced by NLNET::NLMISC_COMMAND().
01394 { 01395 TMsgMappedCallback::iterator itcb = _Callbacks.find(callbackName); 01396 if (itcb == _Callbacks.end()) 01397 return NULL; 01398 else 01399 return (*itcb).second; 01400 } |
|
Definition at line 1030 of file unified_network.cpp. References _IdCnx, nlwarning, uint16, and uint8. Referenced by getNetBase(), send(), and sendAll().
01031 { 01032 if (_IdCnx[sid].Connection.size () == 0) 01033 { 01034 nlwarning ("HNETL5: Can't send message to %s because no connection are available", _IdCnx[sid].ServiceName.c_str ()); 01035 return 0xFF; 01036 } 01037 01038 // by default, connection id will be the default one 01039 uint8 connectionId = _IdCnx[sid].DefaultNetwork; 01040 01041 if (nid == 0xFF) 01042 { 01043 // it s often appen because they didn't set a good network configuration, so it s in debug to disable it easily 01044 //nldebug ("HNETL5: nid %hu, will use the default connection %hu", (uint16)nid, (uint16)connectionId); 01045 } 01046 else if (nid >= _IdCnx[sid].NetworkConnectionAssociations.size()) 01047 { 01048 nlwarning ("HNETL5: No net association for nid %hu, use the default connection %hu", (uint16)nid, (uint16)connectionId); 01049 } 01050 else 01051 { 01052 if (_IdCnx[sid].NetworkConnectionAssociations[nid] >= _IdCnx[sid].Connection.size ()) 01053 { 01054 nlwarning ("HNETL5: Can't send message to %s because nid %d point on a bad connection (%d and only have %d cnx), use default connection", _IdCnx[sid].ServiceName.c_str (), nid, connectionId, _IdCnx[sid].Connection.size ()); 01055 } 01056 else 01057 { 01058 connectionId = _IdCnx[sid].NetworkConnectionAssociations[nid]; 01059 } 01060 } 01061 01062 if (connectionId >= _IdCnx[sid].Connection.size() || !_IdCnx[sid].Connection[connectionId].valid() || !_IdCnx[sid].Connection[connectionId].CbNetBase->connected()) 01063 { 01064 // there's a problem with the selected connectionID, so try to find a valid one 01065 nlwarning ("HNETL5: Can't find selected connection id %hu to send message to %s because connection is not valid or connected, find a valid connection id", (uint16)connectionId, _IdCnx[sid].ServiceName.c_str ()); 01066 01067 for (connectionId = 0; connectionId < _IdCnx[sid].Connection.size(); connectionId++) 01068 { 01069 if (_IdCnx[sid].Connection[connectionId].valid() && _IdCnx[sid].Connection[connectionId].CbNetBase->connected()) 01070 { 01071 // we found one at last, use this one 01072 //nldebug ("HNETL5: Ok, we found a valid connectionid, use %hu", (uint16)connectionId); 01073 break; 01074 } 01075 } 01076 01077 if (connectionId == _IdCnx[sid].Connection.size()) 01078 { 01079 nlwarning ("HNETL5: Can't send message to %s because default connection is not exist, valid or connected", _IdCnx[sid].ServiceName.c_str ()); 01080 return 0xFF; 01081 } 01082 } 01083 return connectionId; 01084 } |
|
Gets the total number of bytes received.
Definition at line 1263 of file unified_network.cpp. References _CbServer, _IdCnx, _UsedConnection, NLNET::CCallbackNetBase::getBytesReceived(), uint, and uint64. Referenced by NLNET::NLMISC_DYNVARIABLE().
01264 { 01265 uint64 received = 0; 01266 uint j; 01267 01268 for (vector<uint16>::iterator it = _UsedConnection.begin (); it != _UsedConnection.end(); it++) 01269 { 01270 if (_IdCnx[(*it)].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01271 for (j=0; j<_IdCnx[(*it)].Connection.size (); ++j) 01272 if(_IdCnx[(*it)].Connection[j].valid () && !_IdCnx[(*it)].Connection[j].IsServerConnection) 01273 received += _IdCnx[(*it)].Connection[j].CbNetBase->getBytesReceived(); 01274 } 01275 01276 /* for (i=0; i<_IdCnx.size(); ++i) 01277 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01278 for (j=0; j<_IdCnx[i].Connection.size (); ++j) 01279 if(_IdCnx[i].Connection[j].valid () && !_IdCnx[i].Connection[j].IsServerConnection) 01280 received += _IdCnx[i].Connection[j].CbNetBase->getBytesReceived(); 01281 */ 01282 if (_CbServer) 01283 received += _CbServer->getBytesReceived(); 01284 return received; 01285 } |
|
Gets the total number of bytes sent.
Definition at line 1239 of file unified_network.cpp. References _CbServer, _IdCnx, _UsedConnection, NLNET::CCallbackNetBase::getBytesSent(), uint, and uint64. Referenced by NLNET::NLMISC_DYNVARIABLE().
01240 { 01241 uint64 sent = 0; 01242 uint j; 01243 01244 for (vector<uint16>::iterator it = _UsedConnection.begin (); it != _UsedConnection.end(); it++) 01245 { 01246 if (_IdCnx[(*it)].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01247 for (j=0; j<_IdCnx[(*it)].Connection.size (); ++j) 01248 if(_IdCnx[(*it)].Connection[j].valid () && !_IdCnx[(*it)].Connection[j].IsServerConnection) 01249 sent += _IdCnx[(*it)].Connection[j].CbNetBase->getBytesSent(); 01250 } 01251 01252 /* for (i=0; i<_IdCnx.size(); ++i) 01253 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01254 for (j=0; j<_IdCnx[i].Connection.size (); ++j) 01255 if(_IdCnx[i].Connection[j].valid () && !_IdCnx[i].Connection[j].IsServerConnection) 01256 sent += _IdCnx[i].Connection[j].CbNetBase->getBytesSent(); 01257 */ 01258 if(_CbServer) 01259 sent += _CbServer->getBytesSent(); 01260 return sent; 01261 } |
|
Return the service ids of the active connections.
Definition at line 227 of file unified_network.h. References _UsedConnection.
00227 { return _UsedConnection; } |
|
Returns the singleton instance of the CUnifiedNetwork class. Definition at line 1481 of file unified_network.cpp. References CUnifiedNetwork(). Referenced by NLNET::IService::main().
01482 { 01483 if (_Instance == NULL) 01484 _Instance = new CUnifiedNetwork(); 01485 01486 return _Instance; 01487 } |
|
Gets the CCallbackNetBase of the service.
Definition at line 1368 of file unified_network.cpp. References _IdCnx, findConnectionId(), NLMISC::getThreadId(), nlassertex, nlwarning, NLNET::ThreadCreator, NLNET::TSockId, uint16, and uint8.
01369 { 01370 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::getNetBase() whereas it is not initialised yet")); 01371 01372 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 01373 01374 if (sid >= _IdCnx.size () || _IdCnx[sid].State != CUnifiedNetwork::CUnifiedConnection::Ready) 01375 { 01376 nlwarning ("HNETL5: Can't get net base to the service '%hu' because not in _IdCnx", sid); 01377 host = InvalidSockId; 01378 return NULL; 01379 } 01380 01381 uint8 connectionId = findConnectionId (sid, nid); 01382 if (connectionId == 0xff) // failed 01383 { 01384 nlwarning ("HNETL5: Can't getNetBase %hu because no connection available", sid); 01385 host = InvalidSockId; 01386 return NULL; 01387 } 01388 01389 host = _IdCnx[sid].Connection[connectionId].HostId; 01390 return _IdCnx[sid].Connection[connectionId].CbNetBase; 01391 } |
|
Gets the CCallbackNetBase of the service.
Definition at line 1335 of file unified_network.cpp. References _IdCnx, _NamedCnx, count, findConnectionId(), NLMISC::getThreadId(), nlassertex, nlwarning, sint, NLNET::ThreadCreator, NLNET::TSockId, and uint8. Referenced by NLNET::NLMISC_COMMAND().
01336 { 01337 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::getNetBase() whereas it is not initialised yet")); 01338 01339 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 01340 01341 sint count = _NamedCnx.count(name); 01342 01343 if (count <= 0) 01344 { 01345 nlwarning ("HNETL5: couldn't access the service %s", name.c_str()); 01346 host = InvalidSockId; 01347 return NULL; 01348 } 01349 else if (count > 1) 01350 { 01351 nlwarning ("HNETL5: %d services %s to getNetBase, returns the first valid", count, name.c_str()); 01352 } 01353 01354 TNameMappedConnection::const_iterator itnmc = _NamedCnx.find(name); 01355 01356 uint8 connectionId = findConnectionId ((*itnmc).second, nid); 01357 if (connectionId == 0xff) // failed 01358 { 01359 nlwarning ("HNETL5: Can't getNetBase %s because no connection available", name.c_str()); 01360 host = InvalidSockId; 01361 return NULL; 01362 } 01363 01364 host = _IdCnx[(*itnmc).second].Connection[connectionId].HostId; 01365 return _IdCnx[(*itnmc).second].Connection[connectionId].CbNetBase; 01366 } |
|
Gets the total number of bytes queued after receiving.
Definition at line 1311 of file unified_network.cpp. References _CbServer, _IdCnx, _UsedConnection, NLNET::CCallbackServer::getReceiveQueueSize(), uint, and uint64. Referenced by NLNET::NLMISC_DYNVARIABLE().
01312 { 01313 uint64 received = 0; 01314 uint j; 01315 01316 for (vector<uint16>::iterator it = _UsedConnection.begin (); it != _UsedConnection.end(); it++) 01317 { 01318 if (_IdCnx[(*it)].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01319 for (j=0; j<_IdCnx[(*it)].Connection.size (); ++j) 01320 if(_IdCnx[(*it)].Connection[j].valid () && !_IdCnx[(*it)].Connection[j].IsServerConnection) 01321 received += _IdCnx[(*it)].Connection[j].CbNetBase->getReceiveQueueSize(); 01322 } 01323 01324 /* for (i=0; i<_IdCnx.size(); ++i) 01325 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01326 for (j=0; j<_IdCnx[i].Connection.size (); ++j) 01327 if(_IdCnx[i].Connection[j].valid () && !_IdCnx[i].Connection[j].IsServerConnection) 01328 received += _IdCnx[i].Connection[j].CbNetBase->getReceiveQueueSize(); 01329 */ 01330 if (_CbServer) 01331 received += _CbServer->getReceiveQueueSize(); 01332 return received; 01333 } |
|
Gets the total number of bytes queued for sending.
Definition at line 1287 of file unified_network.cpp. References _CbServer, _IdCnx, _UsedConnection, NLNET::CCallbackServer::getSendQueueSize(), uint, and uint64. Referenced by NLNET::NLMISC_DYNVARIABLE().
01288 { 01289 uint64 sent = 0; 01290 uint j; 01291 01292 for (vector<uint16>::iterator it = _UsedConnection.begin (); it != _UsedConnection.end(); it++) 01293 { 01294 if (_IdCnx[(*it)].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01295 for (j=0; j<_IdCnx[(*it)].Connection.size (); ++j) 01296 if(_IdCnx[(*it)].Connection[j].valid () && !_IdCnx[(*it)].Connection[j].IsServerConnection) 01297 sent += _IdCnx[(*it)].Connection[j].CbNetBase->getSendQueueSize(); 01298 } 01299 01300 /* for (i=0; i<_IdCnx.size(); ++i) 01301 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01302 for (j=0; j<_IdCnx[i].Connection.size (); ++j) 01303 if(_IdCnx[i].Connection[j].valid () && !_IdCnx[i].Connection[j].IsServerConnection) 01304 sent += _IdCnx[i].Connection[j].CbNetBase->getSendQueueSize(); 01305 */ 01306 if (_CbServer) 01307 sent += _CbServer->getSendQueueSize(); 01308 return sent; 01309 } |
|
Return the name of the specified service, or "" if not found.
Definition at line 1451 of file unified_network.cpp. References getUnifiedConnection(), s, NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceName, and uint16.
01452 { 01453 string s; 01454 CUnifiedConnection *c = getUnifiedConnection(sid, false); 01455 if (c) 01456 s = c->ServiceName; 01457 return s; 01458 } |
|
Return a string identifying the service, using the format "NAME-sid" (or "sid" only if not found).
Definition at line 1464 of file unified_network.cpp. References getUnifiedConnection(), s, NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceName, NLMISC::toString(), and uint16.
|
|
Definition at line 1498 of file unified_network.cpp. References _IdCnx, AUTOCHECK_DISPLAY, nlwarning, and uint16. Referenced by displayUnifiedConnection(), getServiceName(), getServiceUnifiedName(), NLNET::uncbDisconnection(), NLNET::uncbMsgProcessing(), and NLNET::uNetUnregistrationBroadcast().
01499 { 01500 if (sid < _IdCnx.size () && _IdCnx[sid].State == CUnifiedConnection::Ready) 01501 { 01502 if (sid != _IdCnx[sid].ServiceId) 01503 { 01504 AUTOCHECK_DISPLAY ("HNETL5: Sid index %hu is not the same that in the entry %hu", sid, _IdCnx[sid].ServiceId); 01505 return NULL; 01506 } 01507 return &_IdCnx[sid]; 01508 } 01509 else 01510 { 01511 if ( warn ) 01512 nlwarning ("HNETL5: Try to get a bad unified connection (sid %hu is not in the table)", sid); 01513 return NULL; 01514 } 01515 } |
|
Definition at line 1684 of file unified_network.cpp. References _NamedCnx, range, and uint16. Referenced by update().
01685 { 01686 CUnifiedNetwork::TNameMappedConnection::iterator it; 01687 pair<CUnifiedNetwork::TNameMappedConnection::iterator,CUnifiedNetwork::TNameMappedConnection::iterator> range; 01688 range = _NamedCnx.equal_range(name); 01689 01690 if (range.first != range.second) 01691 { 01692 for (it=range.first; it!=range.second && (*it).second!=sid; ++it) 01693 ; 01694 01695 return (it != range.second); 01696 } 01697 return false; 01698 } |
|
Creates the connection to the Naming Service. If the connection failed, ESocketConnectionFailed exception is generated. This function is called automatically called by the service class at the beginning.
Definition at line 479 of file unified_network.cpp. References _CbServer, _NamingServiceAddr, _ServerPort, NLNET::CCallbackNetBase::addCallbackArray(), addr, AUTOCHECK_DISPLAY, NLNET::fd, NLMISC::getThreadId(), NLNET::CBufServer::init(), NLNET::CInetAddress::isValid(), nlassert, nlinfo, NLNET::CCallbackServer::setConnectionCallback(), NLNET::CCallbackNetBase::setDefaultCallback(), NLNET::CCallbackServer::setDisconnectionCallback(), NLMISC::CFileDisplayer::setParam(), NLNET::ThreadCreator, NLMISC::toString(), NLNET::TServiceId, uint, uint16, NLNET::uncbConnection(), NLNET::uncbDisconnection(), NLNET::uncbMsgProcessing(), NLNET::uNetRegistrationBroadcast(), NLNET::uNetUnregistrationBroadcast(), and NLNET::unServerCbArray.
00481 { 00482 //DebugLog->addNegativeFilter ("HNETL5"); 00483 00484 if (_Initialised) 00485 { 00486 AUTOCHECK_DISPLAY ("HNETL5: Unified network layer already initialized"); 00487 return true; 00488 } 00489 00490 ThreadCreator = NLMISC::getThreadId(); 00491 00492 vector<CInetAddress> laddr = CInetAddress::localAddresses(); 00493 00494 _RecordingState = rec; 00495 _Name = shortName; 00496 _SId = sid; 00497 00498 if (addr != 0) 00499 _NamingServiceAddr = *addr; 00500 00501 // if the address isn't 0, uses the naming service 00502 if (_NamingServiceAddr.isValid ()) 00503 { 00504 // connect the callback to know when a new service comes in or goes down 00505 CNamingClient::setRegistrationBroadcastCallback(uNetRegistrationBroadcast); 00506 CNamingClient::setUnregistrationBroadcastCallback(uNetUnregistrationBroadcast); 00507 00508 // connect to the naming service (may generate a ESocketConnectionFailed exception) 00509 CNamingClient::connect(_NamingServiceAddr, _RecordingState, laddr); 00510 00511 if (port == 0) 00512 port = CNamingClient::queryServicePort (); 00513 } 00514 00515 // setup the server callback only if server port != 0, otherwise there's no server callback 00516 _ServerPort = port; 00517 00518 if(_ServerPort != 0) 00519 { 00520 nlassert (_CbServer == 0); 00521 _CbServer = new CCallbackServer; 00522 _CbServer->init(port); 00523 _CbServer->addCallbackArray(unServerCbArray, 1); // the service ident callback 00524 _CbServer->setDefaultCallback(uncbMsgProcessing); // the default callback wrapper 00525 _CbServer->setConnectionCallback(uncbConnection, NULL); 00526 _CbServer->setDisconnectionCallback(uncbDisconnection, NULL); 00527 } 00528 else 00529 { 00530 nlinfo ("HNETL5: ServerPort is 0 so I don't create a CCallbackServer"); 00531 } 00532 00533 if (CNamingClient::connected()) 00534 { 00535 // register the service 00536 for (uint i = 0; i < laddr.size(); i++) 00537 laddr[i].setPort(_ServerPort); 00538 00539 if (_SId == 0) 00540 { 00541 if ( ! CNamingClient::registerService(_Name, laddr, _SId) ) 00542 { 00543 nlinfo ("HNETL5: Registration denied"); 00544 return false; 00545 } 00546 } 00547 else 00548 { 00549 CNamingClient::registerServiceWithSId(_Name, laddr, _SId); 00550 } 00551 00552 sid = _SId; 00553 00554 nlinfo ("HNETL5: Server '%s' added, registered and listen to port %hu", _Name.c_str (), _ServerPort); 00555 } 00556 00557 string fn = _Name+"_"+toString(_SId)+".log"; 00558 fd.setParam (fn); 00559 test.addDisplayer (&fd); 00560 test.displayNL ("**************INIT***************"); 00561 00562 _Initialised = true; 00563 return true; 00564 } |
|
Returns true if the serviceName service is on the same computer than this service.
Definition at line 1402 of file unified_network.cpp. References _NamedCnx, isServiceLocal(), range, and uint16.
01403 { 01404 // it s me, of course we are local 01405 if (serviceName == _Name) 01406 return true; 01407 01408 pair<TNameMappedConnection::const_iterator,TNameMappedConnection::const_iterator> range; 01409 range = _NamedCnx.equal_range(serviceName); 01410 01411 if (range.first != _NamedCnx.end()) 01412 { 01413 uint16 sid = (*(range.first)).second; 01414 return isServiceLocal (sid); 01415 } 01416 01417 return false; 01418 } |
|
Returns true if the sid service is on the same computer than this service.
Definition at line 1420 of file unified_network.cpp. References _IdCnx, uint, and uint16. Referenced by isServiceLocal(), and NLNET::NLMISC_COMMAND().
01421 { 01422 // it s me, of course we are local 01423 if (sid == _SId) 01424 return true; 01425 01426 if (sid >= _IdCnx.size () || _IdCnx[sid].State != CUnifiedNetwork::CUnifiedConnection::Ready) 01427 { 01428 return false; 01429 } 01430 01431 vector<CInetAddress> laddr = CInetAddress::localAddresses(); 01432 01433 for (uint i = 0; i < laddr.size(); i++) 01434 { 01435 for (uint j = 0; j < _IdCnx[sid].ExtAddress.size(); j++) 01436 { 01437 if (_IdCnx[sid].ExtAddress[j].is127001 ()) 01438 return true; 01439 01440 if (_IdCnx[sid].ExtAddress[j].internalIPAddress () == laddr[i].internalIPAddress ()) 01441 return true; 01442 } 01443 } 01444 return false; 01445 } |
|
Returns true if the application called getInstance(). This function is used to know if the user is using layer 4 or layer 5 Definition at line 1489 of file unified_network.cpp.
01490 { 01491 return (_Instance != NULL); 01492 } |
|
Closes the connection to the naming service, every other connection and free. Definition at line 599 of file unified_network.cpp. References _Callbacks, _CbServer, _DownCallbacks, _IdCnx, _NamedCnx, _UpCallbacks, _UsedConnection, NLNET::CCallbackServer::disconnect(), NLMISC::getThreadId(), nlwarning, NLNET::ThreadCreator, and uint.
00600 { 00601 if (!_Initialised) 00602 return; 00603 00604 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 00605 00606 // disconnect all clients 00607 if(_CbServer) 00608 { 00609 _CbServer->disconnect(InvalidSockId); 00610 delete _CbServer; 00611 _CbServer = 0; 00612 } 00613 00614 // disconnect all connections to servers 00615 for (uint i = 0; i<_IdCnx.size(); ++i) 00616 { 00617 if (_IdCnx[i].State != CUnifiedNetwork::CUnifiedConnection::NotUsed) 00618 { 00619 for(uint j = 0 ; j < _IdCnx[i].Connection.size (); j++) 00620 { 00621 if (_IdCnx[i].Connection[j].valid() && !_IdCnx[i].Connection[j].IsServerConnection) 00622 { 00623 if (_IdCnx[i].Connection[j].CbNetBase->connected ()) 00624 _IdCnx[i].Connection[j].CbNetBase->disconnect(); 00625 00626 delete _IdCnx[i].Connection[j].CbNetBase; 00627 } 00628 } 00629 _IdCnx[i].Connection.clear (); 00630 } 00631 } 00632 00633 // clear all other data 00634 _IdCnx.clear(); 00635 _UsedConnection.clear (); 00636 _NamedCnx.clear(); 00637 _UpCallbacks.clear(); 00638 _DownCallbacks.clear(); 00639 _Callbacks.clear(); 00640 00641 // disconnect the connection with the naming service 00642 if (CNamingClient::connected ()) 00643 CNamingClient::disconnect (); 00644 } |
|
Definition at line 1727 of file unified_network.cpp. References _NamedCnx, NLNET::allstuffs, AUTOCHECK_DISPLAY, range, NLMISC::toString(), and uint16. Referenced by NLNET::uncbDisconnection(), and NLNET::uNetUnregistrationBroadcast().
01728 { 01729 // get all map nodes of that service name 01730 CUnifiedNetwork::TNameMappedConnection::iterator it; 01731 pair<CUnifiedNetwork::TNameMappedConnection::iterator,CUnifiedNetwork::TNameMappedConnection::iterator> range; 01732 range = _NamedCnx.equal_range(name); 01733 01734 // assume not empty 01735 if (range.first == range.second) 01736 { 01737 AUTOCHECK_DISPLAY ("HNETL5: The unified connection %s-%hu wasn't on the _NamedCnx", name.c_str(), sid); 01738 return; 01739 } 01740 01741 // select good service id 01742 for (it=range.first; it!=range.second && (*it).second!=sid; ++it) 01743 ; 01744 01745 // assume id exists 01746 if (it == range.second) 01747 { 01748 AUTOCHECK_DISPLAY ("HNETL5: The unified connection %s-%hu wasn't on the _NamedCnx", name.c_str(), sid); 01749 return; 01750 } 01751 01752 // remove service for map 01753 _NamedCnx.erase(it); 01754 01755 allstuffs += "-name "+name+"-"+toString(sid)+"\n"; 01756 test.displayNL ("-name %s-%hu", name.c_str (), sid); 01757 } |
|
Sends a message to a specific serviceId.
Definition at line 1136 of file unified_network.cpp. References _IdCnx, findConnectionId(), NLMISC::getThreadId(), nlassertex, nlwarning, NLNET::ThreadCreator, uint16, and uint8.
01137 { 01138 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::send(uint16, const CMessage&) whereas it is not initialised yet")); 01139 01140 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 01141 01142 if (sid >= _IdCnx.size () || _IdCnx[sid].State != CUnifiedNetwork::CUnifiedConnection::Ready) 01143 { 01144 // happen when trying to send a message to an unknown service id 01145 nlwarning ("HNETL5: Can't send to the service '%hu' because not in _IdCnx", sid); 01146 return false; 01147 } 01148 01149 uint8 connectionId = findConnectionId (sid, nid); 01150 if (connectionId == 0xff) // failed 01151 { 01152 nlwarning ("HNETL5: Can't send to the service '%hu' because no connection available", sid); 01153 return false; 01154 } 01155 01156 _IdCnx[sid].Connection[connectionId].CbNetBase->send (msgout, _IdCnx[sid].Connection[connectionId].HostId); 01157 return true; 01158 } |
|
Sends a message to a specific serviceName. If there's more than one service with this name, all services of this name will receive the message.
Definition at line 1091 of file unified_network.cpp. References _IdCnx, _NamedCnx, findConnectionId(), NLNET::CMessage::getName(), NLMISC::getThreadId(), nlassertex, nlwarning, range, NLNET::ThreadCreator, uint16, and uint8.
01092 { 01093 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::send(const string&, const CMessage&) whereas it is not initialised yet")); 01094 01095 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 01096 01097 TNameMappedConnection::const_iterator it; 01098 pair<TNameMappedConnection::const_iterator,TNameMappedConnection::const_iterator> range; 01099 range = _NamedCnx.equal_range(serviceName); 01100 01101 bool found = false; 01102 if (range.first != _NamedCnx.end()) 01103 { 01104 for (it=range.first; it!=range.second; ++it) 01105 { 01106 uint16 sid = (*it).second; 01107 if (sid >= _IdCnx.size () || _IdCnx[sid].State != CUnifiedNetwork::CUnifiedConnection::Ready) 01108 { 01109 // It often happen when the service is down (connection broke and the naming not already say that it s down) 01110 // In this case, just warn 01111 nlwarning ("HNETL5: Can't send to the service '%s' because it was in the _NamedCnx but not in _IdCnx (means that the service is down)", serviceName.c_str ()); 01112 return false; 01113 } 01114 01115 found = true; 01116 01117 uint8 connectionId = findConnectionId (sid, nid); 01118 if (connectionId == 0xff) // failed 01119 { 01120 nlwarning ("HNETL5: Can't send message to %hu because no connection available", sid); 01121 found = false; 01122 continue; 01123 } 01124 01125 //nldebug ("HNETL5: send message to %s using nid %d cnx %d / %s", serviceName.c_str (), nid, connectionId, connectionId<_IdCnx[sid].ExtAddress.size ()?_IdCnx[sid].ExtAddress[connectionId].asString().c_str():"???"); 01126 _IdCnx[sid].Connection[connectionId].CbNetBase->send (msgout, _IdCnx[sid].Connection[connectionId].HostId); 01127 } 01128 } 01129 01130 if (!found) 01131 nlwarning ("HNETL5: can't find service %s to send message %s", serviceName.c_str(), msgout.getName().c_str()); 01132 01133 return found; 01134 } |
|
Broadcasts a message to all connected services.
Definition at line 1160 of file unified_network.cpp. References _IdCnx, findConnectionId(), NLMISC::getThreadId(), nlassertex, nlwarning, NLNET::ThreadCreator, uint, and uint8.
01161 { 01162 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::send(const CMessage&) whereas it is not initialised yet")); 01163 01164 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 01165 01166 uint i; 01167 for (i=0; i<_IdCnx.size(); ++i) 01168 { 01169 if (_IdCnx[i].State == CUnifiedNetwork::CUnifiedConnection::Ready) 01170 { 01171 uint8 connectionId = findConnectionId (i, nid); 01172 if (connectionId == 0xff) // failed 01173 { 01174 nlwarning ("HNETL5: Can't send message to %u because no connection available", i); 01175 continue; 01176 } 01177 01178 _IdCnx[i].Connection[connectionId].CbNetBase->send (msgout, _IdCnx[i].Connection[connectionId].HostId); 01179 } 01180 } 01181 } |
|
Sets callback for disconnections. On a client, the callback will be call each time the connection to the server is lost. On a server, the callback is called each time a client is disconnected. You can set more than one callback, each one will be called one after one. If the serviceName is "*", the callback will be call for any services If you set the same callback for a specific service S and for "*", the callback might be call twice (in case the service S is down)
Definition at line 1216 of file unified_network.cpp. References _DownCallbacks, _DownUniCallback, nlassert, and NLNET::TUnifiedNetCallback.
01217 { 01218 nlassert (cb != NULL); 01219 if (serviceName == "*") 01220 { 01221 if (back) 01222 _DownUniCallback.push_back (make_pair(cb, arg)); 01223 else 01224 _DownUniCallback.insert (_DownUniCallback.begin(), make_pair(cb, arg)); 01225 } 01226 else 01227 { 01228 if (back) 01229 _DownCallbacks[serviceName].push_back (make_pair(cb, arg)); 01230 else 01231 _DownCallbacks[serviceName].insert (_DownCallbacks[serviceName].begin(), make_pair(cb, arg)); 01232 } 01233 } |
|
Sets callback for incoming connections. On a client, the callback will be call when the connection to the server is established (the first connection or after the server shutdown and started) On a server, the callback is called each time a new client is connected to him You can set more than one callback, each one will be called one after one. If the serviceName is "*", the callback will be call for any services If you set the same callback for a specific service S and for "*", the callback might be call twice (in case the service S is up)
Definition at line 1197 of file unified_network.cpp. References _UpCallbacks, _UpUniCallback, nlassert, and NLNET::TUnifiedNetCallback.
01198 { 01199 nlassert (cb != NULL); 01200 if (serviceName == "*") 01201 { 01202 if (back) 01203 _UpUniCallback.push_back (make_pair(cb, arg)); 01204 else 01205 _UpUniCallback.insert (_UpUniCallback.begin(), make_pair(cb, arg)); 01206 } 01207 else 01208 { 01209 if (back) 01210 _UpCallbacks[serviceName].push_back (make_pair(cb, arg)); 01211 else 01212 _UpCallbacks[serviceName].insert (_UpCallbacks[serviceName].begin(), make_pair(cb, arg)); 01213 } 01214 } |
|
Call it evenly. the parameter select the timeout value in seconds for each update. You are absolutely certain that this function will not be returns before this amount of time you set. If you set the update timeout value higher than 0, all messages in queues will be process until the time is greater than the timeout user update(). If you set the update timeout value to 0, all messages in queues will be process one time before calling the user update(). In this case, we don't nlSleep(1). Definition at line 857 of file unified_network.cpp. References _CbServer, _IdCnx, _LastRetry, _NamingServiceAddr, _ServerPort, _UsedConnection, addNamedCnx(), NLNET::CInetAddress::asString(), autoCheck(), NLNET::CUnifiedNetwork::CUnifiedConnection::AutoRetry, callServiceUpCallback(), NLNET::CCallbackClient::connect(), NLNET::CUnifiedNetwork::CUnifiedConnection::Connection, NLNET::CUnifiedNetwork::CUnifiedConnection::ExtAddress, NLMISC::getThreadId(), H_AUTO, H_TIME, haveNamedCnx(), NLNET::CUnifiedNetwork::CUnifiedConnection::IsExternal, NLNET::CInetAddress::isValid(), nlassert, nlassertex, nlinfo, NLMISC::nlSleep(), nlwarning, NLNET::CUnifiedNetwork::CUnifiedConnection::SendId, NLMISC::CMemStream::serial(), NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceId, NLNET::CUnifiedNetwork::CUnifiedConnection::ServiceName, NLNET::CUnifiedNetwork::CUnifiedConnection::State, NLNET::ThreadCreator, NLMISC::TTime, uint, uint16, uint8, and NLNET::CCallbackServer::update().
00858 { 00859 H_AUTO(CUnifiedNetworkUpdate); 00860 00861 nlassertex(_Initialised == true, ("Try to CUnifiedNetwork::update() whereas it is not initialised yet")); 00862 00863 if (ThreadCreator != NLMISC::getThreadId()) nlwarning ("HNETL5: Multithread access but this class is not thread safe thread creator = %u thread used = %u", ThreadCreator, NLMISC::getThreadId()); 00864 00865 bool enableRetry; // true every 5 seconds to reconnect if necessary 00866 00867 // Compute the real timeout based on the next update timeout 00868 TTime t0 = CTime::getLocalTime (); 00869 00870 if (timeout > 0) 00871 { 00872 if (_NextUpdateTime == 0) 00873 { 00874 _NextUpdateTime = t0 + timeout; 00875 } 00876 else 00877 { 00878 TTime err = t0 - _NextUpdateTime; 00879 _NextUpdateTime += timeout; 00880 00881 // if we are too late, resync to the next value 00882 while (err > timeout) 00883 { 00884 err -= timeout; 00885 _NextUpdateTime += timeout; 00886 } 00887 00888 timeout -= err; 00889 if (timeout < 0) timeout = 0; 00890 } 00891 } 00892 00893 // check if we need to retry to connect to the client 00894 if ((enableRetry = (t0-_LastRetry > 5000))) 00895 _LastRetry = t0; 00896 00897 // Try to reconnect to the naming service if connection lost 00898 if (_NamingServiceAddr.isValid ()) 00899 { 00900 if (CNamingClient::connected ()) 00901 { 00902 CNamingClient::update (); 00903 } 00904 else if (enableRetry) 00905 { 00906 H_AUTO(L5NSReconnect); 00907 try 00908 { 00909 vector<CInetAddress> laddr = CInetAddress::localAddresses(); 00910 CNamingClient::connect (_NamingServiceAddr, _RecordingState, laddr); 00911 // re-register the service 00912 for (uint i = 0; i < laddr.size(); i++) 00913 laddr[i].setPort(_ServerPort); 00914 CNamingClient::resendRegisteration (_Name, laddr, _SId); 00915 } 00916 catch (ESocketConnectionFailed &) 00917 { 00918 nlwarning ("HNETL5: Could not connect to the Naming Service (%s). Retrying in a few seconds...", _NamingServiceAddr.asString().c_str()); 00919 } 00920 } 00921 } 00922 00923 while (true) 00924 { 00925 // update all server connections 00926 if (_CbServer) 00927 { 00928 _CbServer->update(0); 00929 } 00930 00931 // update all client connections 00932 for (uint k = 0; k<_UsedConnection.size(); ++k) 00933 { 00934 CUnifiedConnection &uc = _IdCnx[_UsedConnection[k]]; 00935 nlassert (uc.State == CUnifiedNetwork::CUnifiedConnection::Ready); 00936 for (uint j = 0; j < uc.Connection.size (); j++) 00937 { 00938 if (!uc.Connection[j].valid()) 00939 continue; 00940 00941 if (uc.Connection[j].IsServerConnection) 00942 continue; 00943 00944 if (uc.Connection[j].CbNetBase->connected ()) 00945 { 00946 uc.Connection[j].CbNetBase->update(0); 00947 } 00948 else if (enableRetry && uc.AutoRetry) 00949 { 00950 H_AUTO(L5AutoReconnect); 00951 try 00952 { 00953 CCallbackClient *cbc = (CCallbackClient *)uc.Connection[j].CbNetBase; 00954 cbc->connect(uc.ExtAddress[j]); 00955 uc.Connection[j].CbNetBase->getSockId()->setAppId(uc.ServiceId); 00956 nlinfo ("HNETL5: reconnection to %s-%hu success", uc.ServiceName.c_str(), uc.ServiceId); 00957 00958 00959 // add the name only if at least one connection is ok 00960 if (!haveNamedCnx (uc.ServiceName, uc.ServiceId)) 00961 addNamedCnx (uc.ServiceName, uc.ServiceId); 00962 00963 // resend the identification is necessary 00964 if (uc.SendId) 00965 { 00966 // send identification to the service 00967 CMessage msg("UN_SIDENT"); 00968 msg.serial(_Name); 00969 00970 uint16 ssid = _SId; 00971 if (uc.IsExternal) 00972 { 00973 // in the case that the service is external, we can't send our sid because the external service can 00974 // have other connection with the same sid (for example, LS can have 2 WS with same sid => sid = 0 and leave 00975 // the other side to find a good number 00976 ssid = 0; 00977 } 00978 msg.serial(ssid); // serializes a 16 bits service id 00979 uint8 pos = j; 00980 msg.serial(pos); // send the position in the connection table 00981 msg.serial (uc.IsExternal); 00982 uc.Connection[j].CbNetBase->send (msg, uc.Connection[j].HostId); 00983 } 00984 00985 // call the user callback 00986 callServiceUpCallback (uc.ServiceName, uc.ServiceId); 00987 /* 00988 CUnifiedNetwork::TNameMappedCallback::iterator it = _UpCallbacks.find(uc.ServiceName); 00989 if (it != _UpCallbacks.end()) 00990 { 00991 // call it 00992 for (list<TCallbackArgItem> it2 = (*it).second.begin(); it2 != (*it).second.end(); it2++) 00993 { 00994 TUnifiedNetCallback cb = (*it2).first; 00995 if (cb) cb(uc.ServiceName, uc.ServiceId, (*it2).second); 00996 } 00997 } 00998 00999 for (uint c = 0; c < _UpUniCallback.size (); c++) 01000 { 01001 if (_UpUniCallback[c].first != NULL) 01002 _UpUniCallback[c].first (uc.ServiceName, uc.ServiceId, _UpUniCallback[c].second); 01003 } 01004 */ 01005 } 01006 catch (ESocketConnectionFailed &e) 01007 { 01008 nlinfo ("HNETL5: can't connect to %s-%hu now (%s)", uc.ServiceName.c_str(), uc.ServiceId, e.what ()); 01009 } 01010 } 01011 } 01012 } 01013 01014 enableRetry = false; 01015 01016 // If it's the end, don't nlSleep() 01017 if (CTime::getLocalTime() - t0 > timeout) 01018 break; 01019 01020 // Enable windows multithreading before rescanning all connections 01021 H_TIME(L5UpdateSleep, nlSleep(1);); 01022 } 01023 01024 autoCheck(); 01025 } |
|
Definition at line 510 of file unified_network.h. |
|
Definition at line 511 of file unified_network.h. |
|
Definition at line 512 of file unified_network.h. |
|
Definition at line 172 of file unified_network.cpp.
|
|
Definition at line 179 of file unified_network.cpp.
00180 { 00181 if(from->appId () == AppIdDeadConnection) 00182 { 00183 nlinfo ("HNETL5: - connec '%s'", from->asString().c_str()); 00184 test.displayNL ("-connect dead conenction"); 00185 } 00186 else 00187 { 00188 CUnifiedNetwork *uni = CUnifiedNetwork::getInstance(); 00189 uint16 sid = (uint16)from->appId(); 00190 CUnifiedNetwork::CUnifiedConnection *uc = uni->getUnifiedConnection (sid); 00191 if (uc == 0) 00192 { 00193 nlinfo ("HNETL5: - connec '%s' sid %hu", from->asString().c_str(), sid); 00194 test.displayNL ("-connect '%s' %hu", from->asString ().c_str (), sid); 00195 } 00196 else 00197 { 00198 nlinfo ("HNETL5: - connec '%s' %s-%hu", from->asString().c_str(), uc->ServiceName.c_str (), sid); 00199 allstuffs += "-connect "+uc->ServiceName+"-"+toString(sid)+"\n"; 00200 test.displayNL ("-connect %s-%hu", uc->ServiceName.c_str (), (uint16)(uc->ServiceId)); 00201 00202 if (uc->IsExternal) 00203 { 00204 if (!uc->AutoRetry) 00205 { 00206 // If it s a external service with no auto retry, remove the connection 00207 00208 // call the user callback 00209 uni->callServiceDownCallback(uc->ServiceName, uc->ServiceId); 00210 00211 /*CUnifiedNetwork::TNameMappedCallback::iterator it2 = uni->_DownCallbacks.find(uc->ServiceName); 00212 00213 if (it2 != uni->_DownCallbacks.end()) 00214 { 00215 // call it 00216 TUnifiedNetCallback cb = (*it2).second.first; 00217 cb(uc->ServiceName, uc->ServiceId, (*it2).second.second); 00218 } 00219 00220 for (uint c = 0; c < uni->_DownUniCallback.size (); c++) 00221 { 00222 if (uni->_DownUniCallback[c].first != NULL) 00223 uni->_DownUniCallback[c].first(uc->ServiceName, uc->ServiceId, uni->_DownUniCallback[c].second); 00224 }*/ 00225 00226 uni->removeNamedCnx (uc->ServiceName, uc->ServiceId); 00227 00228 // remove the _UsedConnection 00229 bool found = false; 00230 for (vector<uint16>::iterator it = uni->_UsedConnection.begin (); it != uni->_UsedConnection.end(); it++) 00231 { 00232 if (*it == uc->ServiceId) 00233 { 00234 found = true; 00235 uni->_UsedConnection.erase (it); 00236 break; 00237 } 00238 } 00239 if (!found) AUTOCHECK_DISPLAY ("HNETL5: can't find the sid %hu in the _UsedConnection", uc->ServiceId); 00240 00241 uc->reset (); 00242 } 00243 } 00244 else 00245 { 00246 // reset the connection 00247 uint i; 00248 for (i = 0; i < uc->Connection.size (); i++) 00249 { 00250 if (uc->Connection[i].valid() && uc->Connection[i].CbNetBase->getSockId(uc->Connection[i].HostId) == from) 00251 { 00252 if (uc->Connection[i].IsServerConnection) 00253 { 00254 // we have to remove the stuffs now because HostId will not be accessible later 00255 uc->Connection[i].reset(); 00256 } 00257 else 00258 { 00259 // if it s a client, we can't delete now because the callback client is currently in use 00260 // only disconnect 00261 if(uc->Connection[i].CbNetBase->connected ()) 00262 { 00263 uc->Connection[i].CbNetBase->disconnect (uc->Connection[i].HostId); 00264 } 00265 } 00266 break; 00267 } 00268 } 00269 if (i == uc->Connection.size ()) 00270 { 00271 AUTOCHECK_DISPLAY ("HNETL5: received a disconnection from a service but the connection is not in my list!"); 00272 } 00273 } 00274 } 00275 00276 from->setAppId (AppIdDeadConnection); 00277 } 00278 } |
|
Definition at line 406 of file unified_network.cpp.
00407 { 00408 if (from->appId() == AppIdDeadConnection) 00409 { 00410 AUTOCHECK_DISPLAY ("HNETL5: Receive a message from a dead connection"); 00411 return; 00412 } 00413 00414 CUnifiedNetwork *uni = CUnifiedNetwork::getInstance(); 00415 uint16 sid = (uint16)from->appId(); 00416 CUnifiedNetwork::TMsgMappedCallback::iterator itcb; 00417 00418 itcb = uni->_Callbacks.find(msgin.getName()); 00419 if (itcb == uni->_Callbacks.end()) 00420 { 00421 // the callback doesn't exist 00422 nlwarning ("HNETL5: Can't find callback '%s' called by service %hu", msgin.getName().c_str(), sid); 00423 } 00424 else 00425 { 00426 CUnifiedNetwork::CUnifiedConnection *uc = uni->getUnifiedConnection (sid); 00427 00428 if (uc == 0) 00429 { 00430 nlwarning ("HNETL5: Received a message from a service %hu that is not ready (bad appid? 0x%"NL_I64"X)", sid, from->appId ()); 00431 return; 00432 } 00433 if((*itcb).second == 0) 00434 { 00435 nlwarning ("HNETL5: Received message %s from a service %hu but the associated callback is NULL", msgin.getName ().c_str(), sid); 00436 return; 00437 } 00438 00439 { 00440 static map<string, CHTimer> timers; 00441 map<string, CHTimer>::iterator it; 00442 00443 { 00444 H_AUTO(L5UCHTimerOverhead); 00445 string callbackName = "USRCB_" + msgin.getName(); 00446 it = timers.find(callbackName); 00447 if(it == timers.end()) 00448 { 00449 it = timers.insert(make_pair(callbackName, CHTimer(NULL))).first; 00450 (*it).second.setName((*it).first.c_str()); 00451 } 00452 } 00453 00454 { 00455 H_AUTO(L5UserCallback); 00456 00457 (*it).second.before(); 00458 (*itcb).second (msgin, uc->ServiceName, sid); 00459 (*it).second.after(); 00460 } 00461 } 00462 00463 uc->TotalCallbackCalled++; 00464 TotalCallbackCalled++; 00465 } 00466 } |
|
Definition at line 284 of file unified_network.cpp.
00285 { 00286 string inSName; 00287 uint16 inSid; 00288 00289 if (from->appId () != AppIdDeadConnection) 00290 AUTOCHECK_DISPLAY ("HNETL5: received a connec ident from an unknown connection 0x%"NL_I64"X", from->appId ()); 00291 00292 // recover the service name and id 00293 msgin.serial(inSName); 00294 msgin.serial(inSid); 00295 uint8 pos; 00296 msgin.serial (pos); 00297 bool isExternal; 00298 msgin.serial (isExternal); 00299 00300 nlinfo ("HNETL5: + connec ident '%s' %s-%hu pos %hu ext %d", from->asString().c_str(), inSName.c_str(), inSid, (uint16)pos, (uint8)isExternal); 00301 00302 allstuffs += "+rconnect "+inSName+"-"+toString(inSid)+" pos "+toString((uint16)pos)+"\n"; 00303 test.displayNL ("+rconnect %s-%hu pos %hu", inSName.c_str (), (uint16)inSid, (uint16)pos); 00304 00305 if(isExternal) 00306 { 00307 nlassert (pos == 0); 00308 } 00309 00310 if (inSid == 0) 00311 { 00312 if (isExternal) 00313 { 00314 inSid = CUnifiedNetwork::getInstance ()->_ExtSId++; 00315 nlwarning ("HNETL5: Received a connection from a service with a SId 0, we give him the SId %d", inSid); 00316 } 00317 else 00318 { 00319 nlwarning ("HNETL5: Received a connection from a service with a SId 0 and wasn't external, disconnecting it"); 00320 netbase.disconnect(); 00321 return; 00322 } 00323 } 00324 00325 from->setAppId(inSid); 00326 00327 // add a new connection to the list 00328 CUnifiedNetwork *uni= CUnifiedNetwork::getInstance(); 00329 00330 if(inSid >= uni->_IdCnx.size ()) 00331 { 00332 uni->_IdCnx.resize (inSid+1); 00333 } 00334 00335 switch(uni->_IdCnx[inSid].State) 00336 { 00337 case CUnifiedNetwork::CUnifiedConnection::NotUsed: // add the new unified connection 00338 uni->_IdCnx[inSid] = CUnifiedNetwork::CUnifiedConnection(inSName, inSid, isExternal); 00339 uni->_UsedConnection.push_back (inSid); 00340 break; 00341 default: 00342 break; 00343 } 00344 00345 if (uni->_IdCnx[inSid].IsExternal != isExternal) 00346 { 00347 AUTOCHECK_DISPLAY ("HNETL5: Receive a connection that is not totally external %d %d", uni->_IdCnx[inSid].IsExternal, isExternal); 00348 return; 00349 } 00350 00351 bool FirstConnection = (uni->_IdCnx[inSid].Connection.size () == 0); 00352 00353 // add the connection to the already inserted unified connection 00354 if (pos >= uni->_IdCnx[inSid].Connection.size ()) 00355 uni->_IdCnx[inSid].Connection.resize(pos+1); 00356 uni->_IdCnx[inSid].Connection[pos] = CUnifiedNetwork::CUnifiedConnection::TConnection(&netbase, from); 00357 00358 // If the connection is external, we'll never receive the ExtAddress by the naming service, so add it manually 00359 if (isExternal) 00360 { 00361 uni->_IdCnx[inSid].ExtAddress.push_back (netbase.hostAddress (from)); 00362 uni->_IdCnx[inSid].setupNetworkAssociation (uni->_NetworkAssociations, uni->_DefaultNetwork); 00363 } 00364 00365 00366 // todo ace temp to savoir comment c est possible ce cas la 00367 if (uni->_IdCnx[inSid].Connection.size() == 3) 00368 { 00369 CUnifiedNetwork::CUnifiedConnection *uc = &uni->_IdCnx[inSid]; 00370 nlstop; 00371 nlinfo ("HNETL5: ext addr %s", vectorCInetAddressToString (uc->ExtAddress).c_str ()); 00372 for(uint i = 0; i < uc->Connection.size(); i++) 00373 nlinfo ("HNETL5: cnx %s", uc->Connection[i].HostId->asString ().c_str ()); 00374 nlinfo ("HNETL5: %s", allstuffs.c_str ()); 00375 } 00376 00377 // send the callback to the user with the first connection 00378 if (FirstConnection) 00379 { 00380 // insert the name in the map to be able to send message with the name 00381 uni->addNamedCnx (inSName, inSid); 00382 00383 uni->callServiceUpCallback (inSName, inSid); 00384 /* 00385 // now we warn the user 00386 CUnifiedNetwork::TNameMappedCallback::iterator it = uni->_UpCallbacks.find(inSName); 00387 if (it != uni->_UpCallbacks.end()) 00388 { 00389 // call it 00390 for (list<TCallbackArgItem> it2 = (*it).second.begin(); it2 != (*it).second.end(); it2++) 00391 { 00392 TUnifiedNetCallback cb = (*it2).first; 00393 if (cb) cb(inSName, inSid, (*it2).second); 00394 } 00395 } 00396 00397 for (uint c = 0; c < uni->_UpUniCallback.size (); c++) 00398 { 00399 if (uni->_UpUniCallback[c].first != NULL) 00400 uni->_UpUniCallback[c].first (inSName, inSid, uni->_UpUniCallback[c].second); 00401 }*/ 00402 } 00403 } |
|
|
|
|
|
Map of callbacks.
Definition at line 454 of file unified_network.h. Referenced by addCallbackArray(), findCallback(), NLNET::NLMISC_COMMAND(), release(), and NLNET::uncbMsgProcessing(). |
|
The callback server.
Definition at line 433 of file unified_network.h. Referenced by CUnifiedNetwork(), getBytesReceived(), getBytesSent(), getReceiveQueueSize(), getSendQueueSize(), init(), release(), and update(). |
|
for each services, which network to take
Definition at line 478 of file unified_network.h. Referenced by addDefaultNetwork(), addService(), clearDefaultNetwork(), NLNET::uncbServiceIdentification(), and NLNET::uNetRegistrationBroadcast(). |
|
Definition at line 441 of file unified_network.h. Referenced by callServiceDownCallback(), release(), and setServiceDownCallback(). |
|
Definition at line 442 of file unified_network.h. Referenced by callServiceDownCallback(), and setServiceDownCallback(). |
|
Used for external service.
Definition at line 457 of file unified_network.h. Referenced by addService(), and CUnifiedNetwork(). |
|
Vector of connections by service id (sid is the entry in this array, it means that there s some hole).
Definition at line 424 of file unified_network.h. Referenced by addService(), autoCheck(), displayInternalTables(), findConnectionId(), getBytesReceived(), getBytesSent(), getNetBase(), getReceiveQueueSize(), getSendQueueSize(), getUnifiedConnection(), isServiceLocal(), NLNET::NLMISC_COMMAND(), release(), send(), sendAll(), NLNET::uncbServiceIdentification(), NLNET::uNetRegistrationBroadcast(), and update(). |
|
true if initialisation function called
Definition at line 472 of file unified_network.h. |
|
The main instance.
Definition at line 1479 of file unified_network.cpp. |
|
Last time of retry.
Definition at line 460 of file unified_network.h. Referenced by CUnifiedNetwork(), and update(). |
|
Service name.
Definition at line 451 of file unified_network.h. |
|
Map of connections by service name.
Definition at line 430 of file unified_network.h. Referenced by addNamedCnx(), autoCheck(), displayInternalTables(), getNetBase(), haveNamedCnx(), isServiceLocal(), release(), removeNamedCnx(), and send(). |
|
Naming service.
Definition at line 469 of file unified_network.h. |
|
for each nid, which network address
Definition at line 475 of file unified_network.h. Referenced by addNetworkAssociation(), addService(), autoCheck(), clearNetworkAssociation(), displayInternalTables(), NLNET::uncbServiceIdentification(), and NLNET::uNetRegistrationBroadcast(). |
|
Time of the theorical next update.
Definition at line 463 of file unified_network.h. |
|
Recording state.
Definition at line 445 of file unified_network.h. |
|
The server port.
Definition at line 436 of file unified_network.h. |
|
Service id of the running service.
Definition at line 448 of file unified_network.h. Referenced by NLNET::NLMISC_COMMAND(), and NLNET::uNetRegistrationBroadcast(). |
|
Map of the up/down service callbacks.
Definition at line 439 of file unified_network.h. Referenced by callServiceUpCallback(), release(), and setServiceUpCallback(). |
|
Definition at line 440 of file unified_network.h. Referenced by callServiceUpCallback(), and setServiceUpCallback(). |
|
This vector contains only an index to the unified connection. It is used to have quick access on the available connections.
Definition at line 427 of file unified_network.h. Referenced by addService(), autoCheck(), displayInternalTables(), getBytesReceived(), getBytesSent(), getConnectionList(), getReceiveQueueSize(), getSendQueueSize(), release(), NLNET::uncbDisconnection(), NLNET::uncbServiceIdentification(), NLNET::uNetRegistrationBroadcast(), NLNET::uNetUnregistrationBroadcast(), and update(). |