#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(). |
1.3.6