#include <callback_server.h>
Inheritance diagram for NLNET::CCallbackServer:
Nevrax France
Definition at line 44 of file callback_server.h.
Public Types | |
enum | TEventType { User = 'U', Connection = 'C', Disconnection = 'D' } |
Type of incoming events (max 256). More... | |
enum | TRecordingState { Off, Record, Replay } |
enum | TThreadStategy { SpreadSockets, FillThreads } |
Public Member Functions | |
void | addCallbackArray (const TCallbackItem *callbackarray, NLMISC::CStringIdArray::TStringId arraysize) |
void | authorizeOnly (const char *callbackName, TSockId hostid=InvalidSockId) |
uint64 | bytesReceived () const |
Returns the number of bytes popped by receive() since the beginning. | |
uint64 | bytesSent () const |
Returns the number of bytes pushed by send() since the beginning. | |
CCallbackServer (TRecordingState rec=Off, const std::string &recfilename="", bool recordall=true) | |
Constructor. | |
bool | connected () const |
Returns true if the connection is still connected. on server, we always "connected". | |
void | disconnect (TSockId hostid, bool quick=false) |
void | disconnect (TSockId hostid) |
void | displayAllMyAssociations () |
void | displayReceiveQueueStat (NLMISC::CLog *log=NLMISC::InfoLog) |
void | displaySendQueueStat (NLMISC::CLog *log=NLMISC::InfoLog, TSockId destid=InvalidSockId) |
void | displayThreadStat (NLMISC::CLog *log=NLMISC::InfoLog) |
bool | flush (TSockId destid) |
Force to send all data pending in the send queue. | |
uint64 | getBytesReceived () |
uint64 | getBytesSent () |
uint64 | getReceiveQueueSize () |
uint32 | getSendQueueSize (TSockId destid) |
uint64 | getSendQueueSize () |
NLMISC::CStringIdArray & | getSIDA () |
Use this function to get the String ID Array needed when you want to create a message. | |
virtual TSockId | getSockId (TSockId hostid=InvalidSockId) |
Returns the sockid (cf. CCallbackClient). | |
const CInetAddress & | hostAddress (TSockId hostid) |
Returns the address of the specified host. | |
void | ignoreAllUnknownId (bool b) |
void | init (uint16 port) |
Listens on the specified port. | |
bool | isAServer () const |
Returns true if this is a CCallbackServer. | |
const CInetAddress & | listenAddress () const |
Returns the internet address of the listening socket. | |
uint32 | maxExpectedBlockSize () const |
Returns the max size of the received messages (default: 2^31-1). | |
uint32 | maxSentBlockSize () const |
Returns the max size of the sent messages (default: 2^31-1). | |
uint32 | nbConnections () const |
Returns the number of connections (at the last update()). | |
uint64 | newBytesReceived () |
Returns the number of bytes popped by receive() since the previous call to this method. | |
uint64 | newBytesSent () |
Returns the number of bytes pushed by send() since the previous call to this method. | |
void | receive (NLMISC::CMemStream &buffer, TSockId *hostid) |
void | send (const CMessage &buffer, TSockId hostid, bool log=true) |
Sends a message to the specified host. | |
void | setConnectionCallback (TNetCallback cb, void *arg) |
Sets callback for incoming connections (or NULL to disable callback). | |
void | setDefaultCallback (TMsgCallback defaultCallback) |
Sets default callback for unknown message types. | |
void | setDisconnectionCallback (TNetCallback cb, void *arg) |
Sets callback for disconnections (or NULL to disable callback). | |
void | setMaxExpectedBlockSize (sint32 limit) |
void | setMaxSentBlockSize (sint32 limit) |
void | setOtherSideAssociations (const char **associationarray, NLMISC::CStringIdArray::TStringId arraysize) |
void | setSizeFlushTrigger (TSockId destid, sint32 size) |
void | setTimeFlushTrigger (TSockId destid, sint32 ms) |
void | update () |
Update the network (call this method evenly). | |
void | update (sint32 timeout=0) |
Updates the network (call this method evenly). | |
Protected Member Functions | |
void | addNewThread (CThreadPool &threadpool, CServerBufSock *bufsock) |
void * | argOfConnectionCallback () const |
Returns the argument of the connection callback. | |
void * | argOfDisconnectionCallback () const |
Returns the argument of the disconnection callback. | |
void | baseUpdate (sint32 timeout=0) |
Used by client and server class. | |
void | checkThreadId () const |
TNetCallback | connectionCallback () const |
Returns the connection callback. | |
volatile bool | dataAvailableFlag () const |
Return _DataAvailable. | |
TNetCallback | disconnectionCallback () const |
Returns the disconnection callback. | |
void | dispatchNewSocket (CServerBufSock *bufsock) |
bool | noDelay () const |
Returns the TCP_NODELAY flag. | |
void | processOneMessage () |
Read a message from the network and process it. | |
void | pushBufferToHost (const NLMISC::CMemStream &buffer, TSockId hostid) |
Pushes a buffer to the specified host's send queue and update (unless not connected). | |
void | pushMessageIntoReceiveQueue (const uint8 *buffer, uint32 size) |
void | pushMessageIntoReceiveQueue (const std::vector< uint8 > &buffer) |
Push message into receive queue (mutexed). | |
CSynchronizedFIFO & | receiveQueue () |
Access to the receive queue. | |
CServerReceiveTask * | receiveTask (std::vector< NLMISC::IThread * >::iterator ipt) |
Returns the receive task corresponding to a particular thread. | |
void | setDataAvailableFlag (bool da) |
Sets _DataAvailable. | |
Protected Attributes | |
uint64 | _BytesReceived |
uint64 | _BytesSent |
std::vector< TCallbackItem > | _CallbackArray |
TMsgCallback | _DefaultCallback |
bool | _FirstUpdate |
NLMISC::CStringIdArray | _InputSIDA |
bool | _IsAServer |
TNetCallback | _NewDisconnectionCallback |
Used by client and server class. | |
NLMISC::CStringIdArray | _OutputSIDA |
uint | _ThreadId |
Private Member Functions | |
bool | dataAvailable () |
void | receive (CMessage &buffer, TSockId *hostid) |
On this layer, you can't call directly receive, It s the update() function that receive and call your callaback. | |
void | send (const NLMISC::CMemStream &buffer, TSockId hostid) |
This function is public in the base class and put it private here because user cannot use it in layer 2. | |
void | sendAllMyAssociations (TSockId to) |
Used by client and server class. | |
Private Attributes | |
TNetCallback | _ConnectionCallback |
Connection callback. | |
void * | _ConnectionCbArg |
Argument of the connection callback. | |
Friends | |
void | cbsNewConnection (TSockId from, void *data) |
class | CListenTask |
class | CServerBufSock |
class | CServerReceiveTask |
class | NLNET::CBufSock |
|
Type of incoming events (max 256).
Definition at line 79 of file buf_net_base.h.
00079 { User = 'U', Connection = 'C', Disconnection = 'D' }; |
|
Definition at line 163 of file callback_net_base.h.
|
|
Definition at line 160 of file buf_server.h.
00160 { SpreadSockets, FillThreads }; |
|
Constructor.
Definition at line 70 of file callback_server.cpp. References NLNET::cbsNewConnection(), DEFAULT_MAX_SOCKETS_PER_THREADS, DEFAULT_MAX_THREADS, DEFAULT_STRATEGY, and nlassertex.
00070 : 00071 CCallbackNetBase( rec, recfilename, recordall ), 00072 CBufServer( DEFAULT_STRATEGY, DEFAULT_MAX_THREADS, DEFAULT_MAX_SOCKETS_PER_THREADS, true, rec==Replay ), 00073 _ConnectionCallback(NULL), 00074 _ConnectionCbArg(NULL) 00075 { 00076 #ifndef USE_MESSAGE_RECORDER 00077 nlassertex( rec==Off, ("LNETL3S: The message recorder is disabled at compilation time ; switch the recording state Off") ); 00078 #endif 00079 00080 CBufServer::setDisconnectionCallback (_NewDisconnectionCallback, this); 00081 CBufServer::setConnectionCallback (cbsNewConnection, this); 00082 00083 _IsAServer = true; 00084 _DefaultCallback = NULL; 00085 } |
|
Appends callback array with the specified array. You can add callback only *after* adding the server or the client.
Definition at line 184 of file callback_net_base.cpp. References NLNET::CCallbackNetBase::_CallbackArray, NLNET::CCallbackNetBase::_OutputSIDA, NLMISC::CStringIdArray::addString(), NLNET::TCallbackItem::Callback, NLNET::CCallbackNetBase::checkThreadId(), nlassert, NLMISC::CStringIdArray::resize(), sint, NLMISC::CStringIdArray::size(), NLMISC::CStringIdArray::TStringId, and uint. Referenced by NLNET::CCallbackClient::CCallbackClient(), NLNET::CCallbackNetBase::CCallbackNetBase(), NLNET::CPacsClient::connect(), NLNET::CNamingClient::connect(), NLNET::CLoginClient::connectToShard(), NLNET::CUnifiedNetwork::init(), NLNET::CLoginServer::init(), and NLNET::_CUniTime::installServer().
00185 { 00186 checkThreadId (); 00187 00188 // be sure that the 2 array have the same size 00189 nlassert (_CallbackArray.size () == (uint)_OutputSIDA.size ()); 00190 00191 if (arraysize == 1 && callbackarray[0].Callback == NULL && string("") == callbackarray[0].Key) 00192 { 00193 // it's an empty array, ignore it 00194 return; 00195 } 00196 00197 // resize the array 00198 sint oldsize = _CallbackArray.size(); 00199 00200 _CallbackArray.resize (oldsize + arraysize); 00201 _OutputSIDA.resize (oldsize + arraysize); 00202 00203 //TOO MUCH MESSAGE nldebug ("L3NB_CB: Adding %d callback to the array", arraysize); 00204 00205 for (sint i = 0; i < arraysize; i++) 00206 { 00207 CStringIdArray::TStringId ni = oldsize + i; 00208 //TOO MUCH MESSAGE nldebug ("L3NB_CB: Adding callback to message '%s', id '%d'", callbackarray[i].Key, ni); 00209 // copy callback value 00210 00211 _CallbackArray[ni] = callbackarray[i]; 00212 // add the string to the string id array 00213 _OutputSIDA.addString (callbackarray[i].Key, ni); 00214 00215 } 00216 // nldebug ("LNETL3NB_CB: Added %d callback Now, there're %d callback associated with message type", arraysize, _CallbackArray.size ()); 00217 } |
|
Definition at line 958 of file buf_server.cpp. References NLNET::CServerReceiveTask::addNewSocket(), NLNET::CBufServer::CServerReceiveTask, NLNET::CThreadPool, nlassert, nldebug, nlnettrace, and NLNET::CServerBufSock::setOwnerTask(). Referenced by NLNET::CBufServer::dispatchNewSocket().
00959 { 00960 nlnettrace( "CBufServer::addNewThread" ); 00961 nlassert( bufsock != NULL ); 00962 00963 // Create new task and dispatch the socket to it 00964 CServerReceiveTask *task = new CServerReceiveTask( this ); 00965 bufsock->setOwnerTask( task ); 00966 task->addNewSocket( bufsock ); 00967 00968 // Add a new thread to the pool, with this task 00969 IThread *thr = IThread::create( task ); 00970 { 00971 threadpool.push_back( thr ); 00972 thr->start(); 00973 nldebug( "LNETL1: Added a new thread; pool size is %d", threadpool.size() ); 00974 nldebug( "LNETL1: New socket dispatched to thread %d", threadpool.size()-1 ); 00975 } 00976 } |
|
Returns the argument of the connection callback.
Definition at line 314 of file buf_server.h. References NLNET::CBufServer::_ConnectionCbArg. Referenced by NLNET::CBufServer::dataAvailable().
00314 { return _ConnectionCbArg; } |
|
Returns the argument of the disconnection callback.
Definition at line 160 of file buf_net_base.h. References NLNET::CBufNetBase::_DisconnectionCbArg. Referenced by NLNET::CBufServer::dataAvailable(), and NLNET::CBufClient::dataAvailable().
00160 { return _DisconnectionCbArg; }
|
|
Sets the callback that you want the other side calls. If it didn't call this callback, it will be disconnected If cb is NULL, we authorize *all* callback. On a client, the hostid must be InvalidSockId (or ommited). On a server, you must provide a hostid. Definition at line 471 of file callback_net_base.cpp. References NLNET::CBufSock::asString(), NLNET::CBufSock::AuthorizedCallback, NLNET::CCallbackNetBase::checkThreadId(), NLNET::CCallbackNetBase::getSockId(), nlassert, nldebug, and NLNET::TSockId. Referenced by NLNET::cbShardValidation(), and NLNET::ClientConnection().
00472 { 00473 checkThreadId (); 00474 00475 nldebug ("LNETL3NB: authorizeOnly (%s, %s)", callbackName, hostid->asString().c_str()); 00476 00477 hostid = getSockId (hostid); 00478 00479 nlassert (hostid != InvalidSockId); 00480 00481 hostid->AuthorizedCallback = (callbackName == NULL)?"":callbackName; 00482 } |
|
Used by client and server class.
Definition at line 328 of file callback_net_base.cpp. References NLNET::CCallbackNetBase::_FirstUpdate, NLNET::CCallbackNetBase::_InputSIDA, NLNET::CCallbackNetBase::_LastMovedStringArray, NLNET::CCallbackNetBase::_LastUpdateTime, NLNET::CCallbackNetBase::checkThreadId(), NLNET::CCallbackNetBase::dataAvailable(), NLMISC::CStringIdArray::getAskedStringArray(), NLMISC::CStringIdArray::getNeedToAskedStringArray(), H_AUTO, NLMISC::CStringIdArray::moveNeedToAskToAskedStringArray(), nlassert, nldebug, NLMISC::nlSleep(), NLNET::CCallbackNetBase::processOneMessage(), NLNET::CCallbackNetBase::send(), NLMISC::CMemStream::serial(), sint32, size, NLMISC::CStringIdArray::TStringId, and NLMISC::TTime. Referenced by update(), and NLNET::CCallbackClient::update().
00329 { 00330 H_AUTO(L3UpdateCallbackNetBase); 00331 00332 checkThreadId (); 00333 00334 // slow down the layer H_AUTO (CCallbackNetBase_baseUpdate); 00335 00336 nlassert( timeout >= -1 ); 00337 TTime t0 = CTime::getLocalTime(); 00338 00339 // 00340 // The first time, we init time counters 00341 // 00342 if (_FirstUpdate) 00343 { 00344 // nldebug("LNETL3NB: First update()"); 00345 _FirstUpdate = false; 00346 _LastUpdateTime = t0; 00347 _LastMovedStringArray = t0; 00348 } 00349 00350 // 00351 // Every 1 seconds if we have new unknown association, we ask them to the other side 00352 // 00353 if (t0 - _LastUpdateTime > 1000) 00354 { 00355 // nldebug("LNETL3NB: baseUpdate()"); 00356 _LastUpdateTime = t0; 00357 00358 const set<string> &sa = _InputSIDA.getNeedToAskedStringArray (); 00359 if (!sa.empty ()) 00360 { 00361 CMessage msgout (_InputSIDA, "AA"); 00362 //nlassert (sa.size () < 65536); // no size limit anymore 00363 CStringIdArray::TStringId size = sa.size (); 00364 nldebug ("LNETL3NB_ASSOC: I need %d string association, ask them to the other side", size); 00365 msgout.serial (size); 00366 for (set<string>::iterator it = sa.begin(); it != sa.end(); it++) 00367 { 00368 nldebug ("LNETL3NB_ASSOC: what is the id of '%s'?", (*it).c_str ()); 00369 string str(*it); 00370 msgout.serial (str); 00371 } 00372 // send the message to the other side 00373 send (msgout, 0); 00374 _InputSIDA.moveNeedToAskToAskedStringArray(); 00375 _LastMovedStringArray = t0; 00376 } 00377 } 00378 00379 // 00380 // Every 60 seconds if we have not answered association, we ask again to get them! 00381 // 00382 if (!_InputSIDA.getAskedStringArray().empty() && t0 - _LastMovedStringArray > 60000) 00383 { 00384 // we didn't have an answer for the association, resend them 00385 const set<string> sa = _InputSIDA.getAskedStringArray (); 00386 CMessage msgout (_InputSIDA, "AA"); 00387 //nlassert (sa.size () < 65536); // no size limit anymore 00388 CStringIdArray::TStringId size = sa.size (); 00389 nldebug ("LNETL3NB_ASSOC: client didn't answer my asked association, retry! I need %d string association, ask them to the other side", size); 00390 msgout.serial (size); 00391 for (set<string>::iterator it = sa.begin(); it != sa.end(); it++) 00392 { 00393 nldebug ("LNETL3NB_ASSOC: what is the id of '%s'?", (*it).c_str ()); 00394 string str(*it); 00395 msgout.serial (str); 00396 } 00397 // sends the message to the other side 00398 send (msgout, 0); 00399 _LastMovedStringArray = t0; 00400 } 00401 00402 /* 00403 * timeout -1 => read one message in the queue or nothing if no message in queue 00404 * timeout 0 => read all messages in the queue 00405 * timeout other => read all messages in the queue until timeout expired (at least all one time) 00406 */ 00407 00408 bool exit = false; 00409 00410 while (!exit) 00411 { 00412 // process all messages in the queue 00413 while (dataAvailable ()) 00414 { 00415 processOneMessage (); 00416 if (timeout == -1) 00417 { 00418 exit = true; 00419 break; 00420 } 00421 } 00422 00423 // need to exit? 00424 if (timeout == 0 || (sint32)(CTime::getLocalTime() - t0) > timeout) 00425 { 00426 exit = true; 00427 } 00428 else 00429 { 00430 // enable multithreading on windows :-/ 00431 // slow down the layer H_AUTO (CCallbackNetBase_baseUpdate_nlSleep); 00432 nlSleep (10); 00433 } 00434 } 00435 00436 #ifdef USE_MESSAGE_RECORDER 00437 _MR_UpdateCounter++; 00438 #endif 00439 00440 } |
|
Returns the number of bytes popped by receive() since the beginning.
Definition at line 255 of file buf_server.h. References NLNET::CBufServer::_BytesPoppedIn, and uint64. Referenced by NLNET::CBufServer::newBytesReceived().
00255 { return _BytesPoppedIn; }
|
|
Returns the number of bytes pushed by send() since the beginning.
Definition at line 261 of file buf_server.h. References NLNET::CBufServer::_BytesPushedOut, and uint64. Referenced by NLNET::CBufServer::newBytesSent().
00261 { return _BytesPushedOut; }
|
|
|
Returns true if the connection is still connected. on server, we always "connected".
Reimplemented from NLNET::CCallbackNetBase. Definition at line 67 of file callback_server.h. References NLNET::CCallbackNetBase::checkThreadId().
00067 { checkThreadId (); return true; } |
|
Returns the connection callback.
Definition at line 311 of file buf_server.h. References NLNET::CBufServer::_ConnectionCallback, and NLNET::TNetCallback. Referenced by NLNET::CBufServer::dataAvailable().
00311 { return _ConnectionCallback; } |
|
Checks if there is some data to receive. Returns false if the receive queue is empty. This is where the connection/disconnection callbacks can be called. Reimplemented from NLNET::CBufServer. Definition at line 283 of file callback_server.cpp. References NLNET::CCallbackNetBase::checkThreadId().
00284 { 00285 checkThreadId (); 00286 00287 #ifdef USE_MESSAGE_RECORDER 00288 if ( _MR_RecordingState != Replay ) 00289 { 00290 #endif 00291 00292 // Real dataAvailable() 00293 return CBufServer::dataAvailable (); 00294 00295 #ifdef USE_MESSAGE_RECORDER 00296 } 00297 else 00298 { 00299 // Simulated dataAvailable() 00300 return CCallbackNetBase::replayDataAvailable(); 00301 } 00302 #endif 00303 } |
|
Return _DataAvailable.
Definition at line 206 of file buf_net_base.h. References NLNET::CBufNetBase::_DataAvailable. Referenced by NLNET::CBufServer::dataAvailable(), and NLNET::CBufClient::dataAvailable().
00206 { return _DataAvailable; }
|
|
Disconnect a connection Set hostid to InvalidSockId to disconnect all connections. If hostid is not InvalidSockId and the socket is not connected, the method does nothing. If quick is true, any pending data will not be sent before disconnecting. Definition at line 251 of file buf_server.cpp. References NLNET::CServerReceiveTask::_Connections, NLNET::CBufServer::_ThreadPool, NLNET::CSock::connected(), NLNET::CTcpSock::disconnect(), NLNET::CBufSock::flush(), nlnettrace, NLNET::CBufServer::receiveTask(), NLNET::CBufSock::Sock, and NLNET::TSockId.
00252 { 00253 nlnettrace( "CBufServer::disconnect" ); 00254 if ( hostid != InvalidSockId ) 00255 { 00256 // Disconnect only if physically connected 00257 if ( hostid->Sock->connected() ) 00258 { 00259 if ( ! quick ) 00260 { 00261 hostid->flush(); 00262 } 00263 hostid->Sock->disconnect(); // the connection will be removed by the next call of update() 00264 } 00265 } 00266 else 00267 { 00268 // Disconnect all 00269 CThreadPool::iterator ipt; 00270 { 00271 CSynchronized<CThreadPool>::CAccessor poolsync( &_ThreadPool ); 00272 for ( ipt=poolsync.value().begin(); ipt!=poolsync.value().end(); ++ipt ) 00273 { 00274 CServerReceiveTask *task = receiveTask(ipt); 00275 CConnections::iterator ipb; 00276 { 00277 CSynchronized<CConnections>::CAccessor connectionssync( &task->_Connections ); 00278 for ( ipb=connectionssync.value().begin(); ipb!=connectionssync.value().end(); ++ipb ) 00279 { 00280 if ( (*ipb)->Sock->connected() ) 00281 { 00282 if ( ! quick ) 00283 { 00284 (*ipb)->flush(); 00285 } 00286 (*ipb)->Sock->disconnect(); 00287 } 00288 } 00289 } 00290 } 00291 } 00292 } 00293 } |
|
Disconnect a connection Set hostid to InvalidSockId to disconnect all connections. If hostid is not InvalidSockId and the socket is not connected, the method does nothing. Before disconnecting, any pending data is actually sent. Reimplemented from NLNET::CCallbackNetBase. Definition at line 246 of file callback_server.cpp. References NLNET::CCallbackNetBase::checkThreadId(), and NLNET::TSockId. Referenced by NLNET::cbWSDisconnectClient(), and NLNET::CUnifiedNetwork::release().
00247 { 00248 checkThreadId (); 00249 00250 #ifdef USE_MESSAGE_RECORDER 00251 if ( _MR_RecordingState != Replay ) 00252 { 00253 #endif 00254 // Disconnect 00255 CBufServer::disconnect( hostid ); 00256 00257 #ifdef USE_MESSAGE_RECORDER 00258 } 00259 // else, no need to manually replay the disconnection, such as in CCallbackClient, 00260 // it will be replayed during the next update() 00261 #endif 00262 } |
|
Returns the disconnection callback.
Definition at line 157 of file buf_net_base.h. References NLNET::CBufNetBase::_DisconnectionCallback, and NLNET::TNetCallback. Referenced by NLNET::CBufServer::dataAvailable(), and NLNET::CBufClient::dataAvailable().
00157 { return _DisconnectionCallback; }
|
|
Binds a new socket and send buffer to an existing or a new thread (that starts) Note: this method is called in the listening thread. Definition at line 866 of file buf_server.cpp. References NLNET::CBufServer::_MaxSocketsPerThread, NLNET::CBufServer::_MaxThreads, NLNET::CBufServer::_ThreadPool, NLNET::CBufServer::_ThreadStrategy, NLNET::CServerReceiveTask::addNewSocket(), NLNET::CBufServer::addNewThread(), min, nldebug, nlnettrace, nlwarning, NLNET::CServerReceiveTask::numberOfConnections(), NLNET::CBufServer::receiveTask(), NLNET::CServerBufSock::setOwnerTask(), NLNET::CBufServer::SpreadSockets, and uint. Referenced by NLNET::CListenTask::run().
00867 { 00868 nlnettrace( "CBufServer::dispatchNewSocket" ); 00869 00870 CSynchronized<CThreadPool>::CAccessor poolsync( &_ThreadPool ); 00871 if ( _ThreadStrategy == SpreadSockets ) 00872 { 00873 // Find the thread with the smallest number of connections and check if all 00874 // threads do not have the same number of connections 00875 uint min = 0xFFFFFFFF; 00876 uint max = 0; 00877 CThreadPool::iterator ipt, iptmin, iptmax; 00878 for ( iptmin=iptmax=ipt=poolsync.value().begin(); ipt!=poolsync.value().end(); ++ipt ) 00879 { 00880 uint noc = receiveTask(ipt)->numberOfConnections(); 00881 if ( noc < min ) 00882 { 00883 min = noc; 00884 iptmin = ipt; 00885 } 00886 if ( noc > max ) 00887 { 00888 max = noc; 00889 iptmax = ipt; 00890 } 00891 } 00892 00893 // Check if we make the pool of threads grow (if we have not found vacant room 00894 // and if it is allowed to) 00895 if ( (poolsync.value().empty()) || 00896 ((min == max) && (poolsync.value().size() < _MaxThreads)) ) 00897 { 00898 addNewThread( poolsync.value(), bufsock ); 00899 } 00900 else 00901 { 00902 // Dispatch socket to an existing thread of the pool 00903 CServerReceiveTask *task = receiveTask(iptmin); 00904 bufsock->setOwnerTask( task ); 00905 task->addNewSocket( bufsock ); 00906 #ifdef NL_OS_UNIX 00907 task->wakeUp(); 00908 #endif 00909 00910 if ( min >= (uint)_MaxSocketsPerThread ) 00911 { 00912 nlwarning( "LNETL1: Exceeding the maximum number of sockets per thread" ); 00913 } 00914 nldebug( "LNETL1: New socket dispatched to thread %d", iptmin-poolsync.value().begin() ); 00915 } 00916 00917 } 00918 else // _ThreadStrategy == FillThreads 00919 { 00920 CThreadPool::iterator ipt; 00921 for ( ipt=poolsync.value().begin(); ipt!=poolsync.value().end(); ++ipt ) 00922 { 00923 uint noc = receiveTask(ipt)->numberOfConnections(); 00924 if ( noc < _MaxSocketsPerThread ) 00925 { 00926 break; 00927 } 00928 } 00929 00930 // Check if we have to make the thread pool grow (if we have not found vacant room) 00931 if ( ipt == poolsync.value().end() ) 00932 { 00933 if ( poolsync.value().size() == _MaxThreads ) 00934 { 00935 nlwarning( "LNETL1: Exceeding the maximum number of threads" ); 00936 } 00937 addNewThread( poolsync.value(), bufsock ); 00938 } 00939 else 00940 { 00941 // Dispatch socket to an existing thread of the pool 00942 CServerReceiveTask *task = receiveTask(ipt); 00943 bufsock->setOwnerTask( task ); 00944 task->addNewSocket( bufsock ); 00945 #ifdef NL_OS_UNIX 00946 task->wakeUp(); 00947 #endif 00948 nldebug( "LNETL1: New socket dispatched to thread %d", ipt-poolsync.value().begin() ); 00949 } 00950 } 00951 } |
|
Definition at line 464 of file callback_net_base.cpp. References NLNET::CCallbackNetBase::_OutputSIDA, NLNET::CCallbackNetBase::checkThreadId(), and NLMISC::CStringIdArray::display(). Referenced by NLNET::CLoginClient::connectToShard().
00465 { 00466 checkThreadId (); 00467 00468 _OutputSIDA.display (); 00469 } |
|
Implements NLNET::CCallbackNetBase. Definition at line 85 of file callback_server.h.
00085 { CBufServer::displayReceiveQueueStat(log); } |
|
Reimplemented from NLNET::CBufServer. Definition at line 86 of file callback_server.h. References NLNET::TSockId.
00086 { CBufServer::displaySendQueueStat(log, destid); } |
|
Reimplemented from NLNET::CBufServer. Definition at line 88 of file callback_server.h.
00088 { CBufServer::displayThreadStat(log); } |
|
Force to send all data pending in the send queue.
Reimplemented from NLNET::CBufServer. Definition at line 55 of file callback_server.h. References NLNET::CCallbackNetBase::checkThreadId(), nlassert, and NLNET::TSockId.
00055 { checkThreadId (); nlassert( destid != InvalidSockId ); return CBufServer::flush(destid); } |
|
Definition at line 88 of file callback_net_base.h. References NLNET::CCallbackNetBase::_BytesReceived, and uint64. Referenced by NLNET::CUnifiedNetwork::getBytesReceived().
00088 { return _BytesReceived; } |
|
Definition at line 87 of file callback_net_base.h. References NLNET::CCallbackNetBase::_BytesSent, and uint64. Referenced by NLNET::CUnifiedNetwork::getBytesSent().
00087 { return _BytesSent; } |
|
Implements NLNET::CCallbackNetBase. Definition at line 82 of file callback_server.h. References uint64. Referenced by NLNET::CUnifiedNetwork::getReceiveQueueSize().
00082 { return CBufServer::getReceiveQueueSize(); }
|
|
Definition at line 660 of file buf_server.cpp. References NLNET::CServerReceiveTask::_Connections, NLNET::CBufServer::_ThreadPool, NLNET::CBufServer::receiveTask(), NLNET::CBufSock::SendFifo, NLMISC::CBufFIFO::size(), NLNET::TSockId, and uint32.
00661 { 00662 if ( destid != InvalidSockId ) 00663 { 00664 return destid->SendFifo.size(); 00665 } 00666 else 00667 { 00668 // add all client buffers 00669 00670 uint32 total = 0; 00671 00672 // For each thread 00673 CThreadPool::iterator ipt; 00674 { 00675 CSynchronized<CThreadPool>::CAccessor poolsync( &_ThreadPool ); 00676 for ( ipt=poolsync.value().begin(); ipt!=poolsync.value().end(); ++ipt ) 00677 { 00678 // For each thread of the pool 00679 CServerReceiveTask *task = receiveTask(ipt); 00680 CConnections::iterator ipb; 00681 { 00682 CSynchronized<CConnections>::CAccessor connectionssync( &task->_Connections ); 00683 for ( ipb=connectionssync.value().begin(); ipb!=connectionssync.value().end(); ++ipb ) 00684 { 00685 // For each socket of the thread, update sending 00686 total = (*ipb)->SendFifo.size (); 00687 } 00688 } 00689 } 00690 } 00691 return total; 00692 } 00693 } |
|
Implements NLNET::CCallbackNetBase. Definition at line 83 of file callback_server.h. References uint64. Referenced by NLNET::CUnifiedNetwork::getSendQueueSize().
00083 { return CBufServer::getSendQueueSize(0); }
|
|
Use this function to get the String ID Array needed when you want to create a message.
Definition at line 129 of file callback_net_base.h. References NLNET::CCallbackNetBase::_InputSIDA. Referenced by NLNET::cbcMessageRecvAllAssociations(), NLNET::cbnbMessageAskAssociations(), NLNET::cbnbMessageRecvAssociations(), NLNET::cbServerAskUniversalTime(), NLNET::cbShardValidation(), NLNET::CLoginClient::connectToShard(), NLNET::CNetDisplayer::doDisplay(), NLNET::CNamingClient::queryServicePort(), NLNET::CNamingClient::registerService(), NLNET::CNamingClient::registerServiceWithSId(), NLNET::CNamingClient::resendRegisteration(), sendAllMyAssociations(), NLNET::CCallbackNetBase::setOtherSideAssociations(), and NLNET::CNamingClient::unregisterService().
00129 { return _InputSIDA; } |
|
Returns the sockid (cf. CCallbackClient).
Implements NLNET::CCallbackNetBase. Definition at line 268 of file callback_server.cpp. References NLNET::CCallbackNetBase::checkThreadId(), nlassert, and NLNET::TSockId.
00269 { 00270 nlassert (hostid != InvalidSockId); // invalid hostid 00271 checkThreadId (); 00272 nlassert (connected ()); 00273 nlassert (hostid != NULL); 00274 return hostid; 00275 } |
|
Returns the address of the specified host.
Reimplemented from NLNET::CBufServer. Definition at line 77 of file callback_server.h. References NLNET::CCallbackNetBase::checkThreadId(), nlassert, and NLNET::TSockId.
00077 { nlassert(hostid!=InvalidSockId); checkThreadId(); return CBufServer::hostAddress (hostid); } |
|
If you ignore all unknown id, the net will not ask for other side to know new association. It's used in the naming service for example because the naming client will never answer. In this case, it will always send the message with the full string name (slower) Definition at line 157 of file callback_net_base.h. References NLNET::CCallbackNetBase::_InputSIDA, and NLMISC::CStringIdArray::ignoreAllUnknownId().
00158 { 00159 _InputSIDA.ignoreAllUnknownId (b); 00160 } |
|
Listens on the specified port.
Definition at line 93 of file buf_server.cpp. References NLNET::CBufServer::_ListenTask, NLNET::CBufServer::_ListenThread, NLNET::CBufServer::_ReplayMode, NLNET::CListenTask::init(), NLNET::CBufNetBase::maxExpectedBlockSize(), nldebug, nlnettrace, NLMISC::IThread::start(), and uint16. Referenced by NLNET::CNetManager::addServer(), and NLNET::CUnifiedNetwork::init().
00094 { 00095 nlnettrace( "CBufServer::init" ); 00096 if ( ! _ReplayMode ) 00097 { 00098 _ListenTask->init( port, maxExpectedBlockSize() ); 00099 _ListenThread->start(); 00100 } 00101 else 00102 { 00103 nldebug( "LNETL1: Binding listen socket to any address, port %hu", port ); 00104 } 00105 } |
|
Returns true if this is a CCallbackServer.
Definition at line 126 of file callback_net_base.h. References NLNET::CCallbackNetBase::_IsAServer, and NLNET::CCallbackNetBase::checkThreadId().
00126 { checkThreadId (); return _IsAServer; } |
|
Returns the internet address of the listening socket.
Definition at line 238 of file buf_server.h. References NLNET::CBufServer::_ListenTask, and NLNET::CListenTask::localAddr(). Referenced by NLNET::CLoginServer::init(), NLNET::NLMISC_DYNVARIABLE(), and NLNET::setListenAddress().
00238 { return _ListenTask->localAddr(); }
|
|
Returns the max size of the received messages (default: 2^31-1).
Definition at line 135 of file buf_net_base.h. References NLNET::CBufNetBase::_MaxExpectedBlockSize, and uint32. Referenced by NLNET::CBufClient::connect(), and NLNET::CBufServer::init().
00136 {
00137 return _MaxExpectedBlockSize;
00138 }
|
|
Returns the max size of the sent messages (default: 2^31-1).
Definition at line 141 of file buf_net_base.h. References NLNET::CBufNetBase::_MaxSentBlockSize, and uint32. Referenced by NLNET::CBufServer::send(), and NLNET::CBufClient::send().
00142 {
00143 return _MaxSentBlockSize;
00144 }
|
|
Returns the number of connections (at the last update()).
Definition at line 267 of file buf_server.h. References NLNET::CBufServer::_NbConnections, and uint32. Referenced by send().
00267 { return _NbConnections; }
|
|
Returns the number of bytes popped by receive() since the previous call to this method.
Definition at line 749 of file buf_server.cpp. References NLNET::CBufServer::_PrevBytesPoppedIn, NLNET::CBufServer::bytesReceived(), and uint64.
00750 { 00751 uint64 b = bytesReceived(); 00752 uint64 nbrecvd = b - _PrevBytesPoppedIn; 00753 //nlinfo( "b: %"NL_I64"u new: %"NL_I64"u", b, nbrecvd ); 00754 _PrevBytesPoppedIn = b; 00755 return nbrecvd; 00756 } |
|
Returns the number of bytes pushed by send() since the previous call to this method.
Definition at line 761 of file buf_server.cpp. References NLNET::CBufServer::_PrevBytesPushedOut, NLNET::CBufServer::bytesSent(), and uint64.
|
|
Returns the TCP_NODELAY flag.
Definition at line 276 of file buf_server.h. Referenced by NLNET::CListenTask::run().
00276 { return _NoDelay; }
|
|
Read a message from the network and process it.
Definition at line 223 of file callback_net_base.cpp. References NLNET::CCallbackNetBase::_BytesReceived, NLNET::CCallbackNetBase::_CallbackArray, NLNET::CCallbackNetBase::_DefaultCallback, NLNET::CCallbackNetBase::_OutputSIDA, NLNET::CBufSock::asString(), NLNET::CBufSock::AuthorizedCallback, NLNET::CCallbackNetBase::checkThreadId(), NLNET::CCallbackNetBase::disconnect(), NLNET::CMessage::getId(), NLNET::CMessage::getName(), NLNET::CCallbackNetBase::getSockId(), NLNET::CMessage::length(), nldebug, nlwarning, NLNET::CCallbackNetBase::receive(), sint16, NLNET::TMsgCallback, NLNET::CMessage::toString(), NLNET::TSockId, NLMISC::CStringIdArray::TStringId, and NLNET::CMessage::TypeHasAnId. Referenced by NLNET::CCallbackNetBase::baseUpdate().
00224 { 00225 checkThreadId (); 00226 00227 // slow down the layer H_AUTO (CCallbackNetBase_processOneMessage); 00228 00229 CMessage msgin (_OutputSIDA, "", true); 00230 TSockId tsid; 00231 receive (msgin, &tsid); 00232 00233 _BytesReceived += msgin.length (); 00234 00235 // now, we have to call the good callback 00236 NLMISC::CStringIdArray::TStringId pos = -1; 00237 if (msgin.TypeHasAnId) 00238 { 00239 pos = msgin.getId (); 00240 } 00241 else 00242 { 00243 std::string name = msgin.getName (); 00244 sint16 i; 00245 for (i = 0; i < (sint16) _CallbackArray.size (); i++) 00246 { 00247 if (name == _CallbackArray[i].Key) 00248 { 00249 pos = i; 00250 break; 00251 } 00252 } 00253 } 00254 00255 TMsgCallback cb = NULL; 00256 if (pos < 0 || pos >= (sint16) _CallbackArray.size ()) 00257 { 00258 if (_DefaultCallback == NULL) 00259 { 00260 nlwarning ("LNETL3NB_CB: Callback %s not found in _CallbackArray", msgin.toString().c_str()); 00261 } 00262 else 00263 { 00264 cb = _DefaultCallback; 00265 } 00266 } 00267 else 00268 { 00269 cb = _CallbackArray[pos].Callback; 00270 } 00271 00272 TSockId realid = getSockId (tsid); 00273 00274 if (!realid->AuthorizedCallback.empty() && msgin.getName() != realid->AuthorizedCallback) 00275 { 00276 nlwarning ("LNETL3NB_CB: %s try to call the callback %s but only %s is authorized. Disconnect him!", tsid->asString().c_str(), msgin.toString().c_str(), tsid->AuthorizedCallback.c_str()); 00277 disconnect (tsid); 00278 } 00279 else if (cb == NULL) 00280 { 00281 nlwarning ("LNETL3NB_CB: Callback %s is NULL, can't call it", msgin.toString().c_str()); 00282 } 00283 else 00284 { 00285 nldebug ("LNETL3NB_CB: Calling callback (%s)%s", msgin.getName().c_str(), (cb==_DefaultCallback)?" DEFAULT_CB":""); 00286 cb(msgin, realid, *this); 00287 } 00288 00289 /* 00290 if (pos < 0 || pos >= (sint16) _CallbackArray.size ()) 00291 { 00292 if (_DefaultCallback == NULL) 00293 nlwarning ("LNETL3NB_CB: Callback %s not found in _CallbackArray", msgin.toString().c_str()); 00294 else 00295 { 00296 // ... 00297 } 00298 } 00299 else 00300 { 00301 TSockId realid = getSockId (tsid); 00302 00303 if (!realid->AuthorizedCallback.empty() && msgin.getName() != realid->AuthorizedCallback) 00304 { 00305 nlwarning ("LNETL3NB_CB: %s try to call the callback %s but only %s is authorized. Disconnect him!", tsid->asString().c_str(), msgin.toString().c_str(), tsid->AuthorizedCallback.c_str()); 00306 disconnect (tsid); 00307 } 00308 else if (_CallbackArray[pos].Callback == NULL) 00309 { 00310 nlwarning ("LNETL3NB_CB: Callback %s is NULL, can't call it", msgin.toString().c_str()); 00311 } 00312 else 00313 { 00314 nldebug ("LNETL3NB_CB: Calling callback (%s)", _CallbackArray[pos].Key); 00315 _CallbackArray[pos].Callback (msgin, realid, *this); 00316 } 00317 } 00318 */ 00319 } |
|
Pushes a buffer to the specified host's send queue and update (unless not connected).
Definition at line 298 of file buf_server.h. References NLNET::CBufServer::_BytesPushedOut, buffer, nlassert, NLNET::CBufSock::pushBuffer(), NLNET::TBlockSize, and NLNET::TSockId. Referenced by NLNET::CBufServer::send().
00299 { 00300 nlassert( hostid != InvalidSockId ); 00301 if ( hostid->pushBuffer( buffer ) ) 00302 { 00303 _BytesPushedOut += buffer.length() + sizeof(TBlockSize); // statistics 00304 } 00305 } |
|
Definition at line 183 of file buf_net_base.h. References NLNET::CBufNetBase::_RecvFifo, buffer, NLNET::CFifoAccessor, NLNET::CBufNetBase::setDataAvailableFlag(), size, uint32, and uint8.
00184 { 00185 //sint32 mbsize; 00186 { 00187 //nldebug( "BNB: Acquiring the receive queue... "); 00188 CFifoAccessor recvfifo( &_RecvFifo ); 00189 //nldebug( "BNB: Acquired, pushing the received buffer... "); 00190 recvfifo.value().push( buffer, size ); 00191 //nldebug( "BNB: Pushed, releasing the receive queue..." ); 00192 //mbsize = recvfifo.value().size() / 1048576; 00193 setDataAvailableFlag( true ); 00194 } 00195 //nldebug( "BNB: Released." ); 00196 /*if ( mbsize > 1 ) 00197 { 00198 nlwarning( "The receive queue size exceeds %d MB", mbsize ); 00199 }*/ 00200 } |
|
Push message into receive queue (mutexed).
Definition at line 164 of file buf_net_base.h. References NLNET::CBufNetBase::_RecvFifo, buffer, NLNET::CFifoAccessor, and NLNET::CBufNetBase::setDataAvailableFlag(). Referenced by NLNET::CBufSock::advertiseSystemEvent(), and NLNET::CClientReceiveTask::run().
00165 { 00166 //sint32 mbsize; 00167 { 00168 //nldebug( "BNB: Acquiring the receive queue... "); 00169 CFifoAccessor recvfifo( &_RecvFifo ); 00170 //nldebug( "BNB: Acquired, pushing the received buffer... "); 00171 recvfifo.value().push( buffer ); 00172 //nldebug( "BNB: Pushed, releasing the receive queue..." ); 00173 //mbsize = recvfifo.value().size() / 1048576; 00174 setDataAvailableFlag( true ); 00175 } 00176 //nldebug( "BNB: Released." ); 00177 //if ( mbsize > 1 ) 00178 //{ 00179 // nlwarning( "The receive queue size exceeds %d MB", mbsize ); 00180 //} 00181 } |
|
Receives next block of data in the specified (resizes the vector) You must call dataAvailable() before every call to receive() Definition at line 565 of file buf_server.cpp. References NLNET::CBufServer::_BytesPoppedIn, buffer, NLNET::CFifoAccessor, nlassert, NLMISC_BSWAP32, nlnettrace, nlwarning, NLNET::CBufNetBase::receiveQueue(), NLNET::CBufNetBase::setDataAvailableFlag(), NLNET::TBlockSize, NLNET::TSockId, and uint32.
00566 { 00567 nlnettrace( "CBufServer::receive" ); 00568 //nlassert( dataAvailable() ); 00569 nlassert( phostid != NULL ); 00570 { 00571 CFifoAccessor recvfifo( &receiveQueue() ); 00572 nlassert( ! recvfifo.value().empty() ); 00573 recvfifo.value().front( buffer ); 00574 recvfifo.value().pop(); 00575 setDataAvailableFlag( ! recvfifo.value().empty() ); 00576 } 00577 00578 // Extract hostid (and event type) 00579 *phostid = *((TSockId*)&(buffer.buffer()[buffer.size()-sizeof(TSockId)-1])); 00580 nlassert( buffer.buffer()[buffer.size()-1] == CBufNetBase::User ); 00581 00582 // debug features, we number all packet to be sure that they are all sent and received 00583 // \todo remove this debug feature when ok 00584 #ifdef NL_BIG_ENDIAN 00585 uint32 val = NLMISC_BSWAP32(*(uint32*)buffer.buffer()); 00586 #else 00587 uint32 val = *(uint32*)buffer.buffer(); 00588 #endif 00589 00590 // nldebug ("receive message number %u", val); 00591 if ((*phostid)->ReceiveNextValue != val) 00592 { 00593 nlwarning ("LNETL1: !!!LOST A MESSAGE!!! I received the message number %u but I'm waiting the message number %u (cnx %s), warn lecroart@nevrax.com with the log now please", val, (*phostid)->ReceiveNextValue, (*phostid)->asString().c_str()); 00594 // resync the message number 00595 (*phostid)->ReceiveNextValue = val; 00596 } 00597 00598 (*phostid)->ReceiveNextValue++; 00599 00600 buffer.resize( buffer.size()-sizeof(TSockId)-1 ); 00601 00602 // TODO OPTIM remove the nldebug for speed 00603 //commented for optimisation nldebug( "LNETL1: Read buffer (%d+%d B) from %s", buffer.size(), sizeof(TSockId)+1, /*stringFromVector(buffer).c_str(), */(*phostid)->asString().c_str() ); 00604 00605 // Statistics 00606 _BytesPoppedIn += buffer.size() + sizeof(TBlockSize); 00607 } |
|
On this layer, you can't call directly receive, It s the update() function that receive and call your callaback.
Implements NLNET::CCallbackNetBase. Definition at line 205 of file callback_server.cpp. References buffer, NLNET::CCallbackNetBase::checkThreadId(), nlassert, NLNET::Receiving, and NLNET::TSockId.
00206 { 00207 checkThreadId (); 00208 nlassert (connected ()); 00209 00210 #ifdef USE_MESSAGE_RECORDER 00211 if ( _MR_RecordingState != Replay ) 00212 { 00213 #endif 00214 00215 // Receive 00216 CBufServer::receive (buffer, hostid); 00217 00218 #ifdef USE_MESSAGE_RECORDER 00219 if ( _MR_RecordingState == Record ) 00220 { 00221 // Record received message 00222 _MR_Recorder.recordNext( _MR_UpdateCounter, Receiving, *hostid, const_cast<CMessage&>(buffer) ); 00223 } 00224 } 00225 else 00226 { 00227 // Retrieve received message loaded by dataAvailable() 00228 buffer = _MR_Recorder.ReceivedMessages.front().Message; 00229 *hostid = _MR_Recorder.ReceivedMessages.front().SockId; 00230 _MR_Recorder.ReceivedMessages.pop(); 00231 } 00232 #endif 00233 00234 buffer.readType (); 00235 } |
|
Access to the receive queue.
Definition at line 154 of file buf_net_base.h. References NLNET::CBufNetBase::_RecvFifo, and NLNET::CSynchronizedFIFO. Referenced by NLNET::CBufServer::dataAvailable(), NLNET::CBufClient::dataAvailable(), NLNET::CBufClient::disconnect(), NLNET::CBufServer::receive(), NLNET::CBufClient::receive(), and NLNET::CServerReceiveTask::run().
00154 { return _RecvFifo; }
|
|
Returns the receive task corresponding to a particular thread.
Definition at line 284 of file buf_server.h. Referenced by NLNET::CBufServer::disconnect(), NLNET::CBufServer::dispatchNewSocket(), NLNET::CBufServer::displaySendQueueStat(), NLNET::CBufServer::displayThreadStat(), NLNET::CBufServer::getSendQueueSize(), NLNET::CBufServer::send(), NLNET::CBufServer::update(), and NLNET::CBufServer::~CBufServer().
00285 { 00286 return ((CServerReceiveTask*)((*ipt)->getRunnable())); 00287 } |
|
This function is public in the base class and put it private here because user cannot use it in layer 2.
Reimplemented from NLNET::CBufServer. Definition at line 93 of file callback_server.h. References nlstop, and NLNET::TSockId.
00093 { nlstop; } |
|
Sends a message to the specified host.
Implements NLNET::CCallbackNetBase. Definition at line 124 of file callback_server.cpp. References buffer, NLNET::CCallbackNetBase::checkThreadId(), NLNET::CBufServer::nbConnections(), nlassert, NLNET::Sending, sint, and NLNET::TSockId. Referenced by sendAllMyAssociations().
00125 { 00126 checkThreadId (); 00127 nlassert (connected ()); 00128 nlassert (buffer.length() != 0); 00129 nlassert (buffer.typeIsSet()); 00130 00131 if (hostid == InvalidSockId) 00132 { 00133 // broadcast 00134 sint nb = nbConnections (); 00135 _BytesSent += buffer.length () * nb; 00136 } 00137 else 00138 { 00139 _BytesSent += buffer.length (); 00140 } 00141 00142 // if (log) 00143 { 00144 // nldebug ("LNETL3S: Server: send(%s, %s)", buffer.toString().c_str(), hostid->asString().c_str()); 00145 } 00146 00147 #ifdef USE_MESSAGE_RECORDER 00148 if ( _MR_RecordingState != Replay ) 00149 { 00150 #endif 00151 00152 // Send 00153 CBufServer::send (buffer, hostid); 00154 00155 #ifdef USE_MESSAGE_RECORDER 00156 if ( _MR_RecordingState == Record ) 00157 { 00158 // Record sent message 00159 _MR_Recorder.recordNext( _MR_UpdateCounter, Sending, hostid, const_cast<CMessage&>(buffer) ); 00160 } 00161 } 00162 else 00163 { 00165 } 00166 #endif 00167 } |
|
Used by client and server class.
Reimplemented from NLNET::CCallbackNetBase. Definition at line 91 of file callback_server.cpp. References NLNET::CBufSock::asString(), NLNET::CCallbackNetBase::checkThreadId(), NLNET::CCallbackNetBase::getSIDA(), NLMISC::CStringIdArray::getString(), nlassert, nldebug, send(), NLMISC::CMemStream::serial(), NLMISC::CStringIdArray::size(), size, NLNET::TSockId, and NLMISC::CStringIdArray::TStringId.
00092 { 00093 nlassert (to != InvalidSockId); // invalid hostid 00094 checkThreadId (); 00095 nlassert (connected ()); 00096 00097 // he wants all associations 00098 CMessage msgout (getSIDA(), "RAA"); 00099 00100 CStringIdArray::TStringId size; 00101 size = _OutputSIDA.size (); 00102 00103 nldebug ("LNETL3S: Send all (%d) my string association to %s", size, to->asString().c_str()); 00104 00105 msgout.serial (size); 00106 00107 for (CStringIdArray::TStringId i = 0; i < size; i++) 00108 { 00109 // nldebug ("LNETL3S: sending association '%s' -> %d", _OutputSIDA.getString(i).c_str (), i); 00110 string str(_OutputSIDA.getString(i)); 00111 msgout.serial (str); 00112 msgout.serial (i); 00113 } 00114 00115 send (msgout, to); 00116 } |
|
Sets callback for incoming connections (or NULL to disable callback).
Reimplemented from NLNET::CBufServer. Definition at line 61 of file callback_server.h. References NLNET::CCallbackNetBase::checkThreadId(), and NLNET::TNetCallback. Referenced by NLNET::CNetManager::addServer(), NLNET::CUnifiedNetwork::init(), and NLNET::CLoginServer::init().
00061 { checkThreadId (); _ConnectionCallback = cb; _ConnectionCbArg = arg; } |
|
Sets _DataAvailable.
Definition at line 203 of file buf_net_base.h. References NLNET::CBufNetBase::_DataAvailable. Referenced by NLNET::CBufServer::dataAvailable(), NLNET::CBufClient::dataAvailable(), NLNET::CBufClient::disconnect(), NLNET::CBufNetBase::pushMessageIntoReceiveQueue(), NLNET::CBufServer::receive(), NLNET::CBufClient::receive(), and NLNET::CServerReceiveTask::run().
00203 { _DataAvailable = da; } |
|
Sets default callback for unknown message types.
Definition at line 110 of file callback_net_base.h. References NLNET::CCallbackNetBase::_DefaultCallback, and NLNET::TMsgCallback. Referenced by NLNET::CUnifiedNetwork::addService(), and NLNET::CUnifiedNetwork::init().
00110 { _DefaultCallback = defaultCallback; } |
|
Sets callback for disconnections (or NULL to disable callback).
Reimplemented from NLNET::CCallbackNetBase. Definition at line 64 of file callback_server.h. References NLNET::CCallbackNetBase::checkThreadId(), and NLNET::TNetCallback. Referenced by NLNET::CUnifiedNetwork::init().
00064 { checkThreadId (); CCallbackNetBase::setDisconnectionCallback (cb, arg); } |
|
Sets the max size of the received messages. If receiving a message bigger than the limit, the connection will be dropped. Default value: 1 MegaByte If you put a negative number as limit, the max size is reset to the default value. Warning: you can call this method only at initialization time, before connecting (for a client) or calling init() (for a server) ! Definition at line 109 of file buf_net_base.h. References NLNET::CBufNetBase::_MaxExpectedBlockSize, sint32, and uint32.
00110 { 00111 if ( limit < 0 ) 00112 _MaxExpectedBlockSize = 1048576; 00113 else 00114 _MaxExpectedBlockSize = (uint32)limit; 00115 } |
|
Sets the max size of the sent messages. Note: Limiting of sending not implemented, currently Default value: 1 MegaByte If you put a negative number as limit, the max size is reset to the default value. Warning: you can call this method only at initialization time, before connecting (for a client) or calling init() (for a server) ! Definition at line 126 of file buf_net_base.h. References NLNET::CBufNetBase::_MaxSentBlockSize, sint32, and uint32.
00127 { 00128 if ( limit < 0 ) 00129 _MaxSentBlockSize = 1048576; 00130 else 00131 _MaxSentBlockSize = (uint32)limit; 00132 } |
|
Gives some association of the other side. The goal is, in specific case, we don't want to ask associations to the other side (client is not secure for example). In this case, we can set other side associations by hand using this functions. Definition at line 451 of file callback_net_base.cpp. References NLMISC::CStringIdArray::addString(), NLNET::CCallbackNetBase::checkThreadId(), NLNET::CCallbackNetBase::getSIDA(), nldebug, sint, and NLMISC::CStringIdArray::TStringId.
00452 { 00453 checkThreadId (); 00454 00455 nldebug ("LNETL3NB_ASSOC: setOtherSideAssociations() sets %d association strings", arraysize); 00456 00457 for (sint i = 0; i < arraysize; i++) 00458 { 00459 nldebug ("LNETL3NB_ASSOC: association '%s' -> %d", associationarray[i], i); 00460 getSIDA().addString (associationarray[i], i); 00461 } 00462 } |
|
Sets the size flush trigger. When the size of the send queue reaches or exceeds this value, all data in the send queue is automatically sent (-1 to disable this trigger ) Definition at line 226 of file buf_server.h. References nlassert, NLNET::CBufSock::setSizeFlushTrigger(), sint32, size, and NLNET::TSockId.
00226 { nlassert( destid != InvalidSockId ); destid->setSizeFlushTrigger( size ); } |
|
Sets the time flush trigger (in millisecond). When this time is elapsed, all data in the send queue is automatically sent (-1 to disable this trigger) Definition at line 221 of file buf_server.h. References nlassert, NLNET::CBufSock::setTimeFlushTrigger(), sint32, and NLNET::TSockId.
00221 { nlassert( destid != InvalidSockId ); destid->setTimeFlushTrigger( ms ); } |
|
Update the network (call this method evenly).
Definition at line 613 of file buf_server.cpp. References NLNET::CServerReceiveTask::_Connections, NLNET::CBufServer::_NbConnections, NLNET::CBufServer::_ThreadPool, nldebug, and NLNET::CBufServer::receiveTask().
00614 { 00615 //nlnettrace( "CBufServer::update-BEGIN" ); 00616 00617 _NbConnections = 0; 00618 00619 // For each thread 00620 CThreadPool::iterator ipt; 00621 { 00622 //nldebug( "UPD: Acquiring the Thread Pool" ); 00623 CSynchronized<CThreadPool>::CAccessor poolsync( &_ThreadPool ); 00624 //nldebug( "UPD: Acquired." ); 00625 for ( ipt=poolsync.value().begin(); ipt!=poolsync.value().end(); ++ipt ) 00626 { 00627 // For each thread of the pool 00628 CServerReceiveTask *task = receiveTask(ipt); 00629 CConnections::iterator ipb; 00630 { 00631 CSynchronized<CConnections>::CAccessor connectionssync( &task->_Connections ); 00632 for ( ipb=connectionssync.value().begin(); ipb!=connectionssync.value().end(); ++ipb ) 00633 { 00634 // For each socket of the thread, update sending 00635 if ( ! ((*ipb)->Sock->connected() && (*ipb)->update()) ) 00636 { 00637 // Update did not work or the socket is not connected anymore 00638 nldebug( "LNETL1: Socket %s is disconnected", (*ipb)->asString().c_str() ); 00639 // Disconnection event if disconnected (known either from flush (in update) or when receiving data) 00640 (*ipb)->advertiseDisconnection( this, *ipb ); 00641 00642 /*if ( (*ipb)->advertiseDisconnection( this, *ipb ) ) 00643 { 00644 // Now the connection removal is in dataAvailable() 00645 // POLL6 00646 }*/ 00647 } 00648 else 00649 { 00650 _NbConnections++; 00651 } 00652 } 00653 } 00654 } 00655 } 00656 00657 //nlnettrace( "CBufServer::update-END" ); 00658 } |
|
Updates the network (call this method evenly).
Reimplemented from NLNET::CCallbackNetBase. Definition at line 175 of file callback_server.cpp. References NLNET::CCallbackNetBase::baseUpdate(), NLNET::CCallbackNetBase::checkThreadId(), H_AUTO, nlassert, and sint32. Referenced by NLNET::CUnifiedNetwork::update().
00176 { 00177 H_AUTO(L3UpdateServer); 00178 00179 checkThreadId (); 00180 nlassert (connected ()); 00181 00182 // nldebug ("LNETL3S: Client: update()"); 00183 baseUpdate ( timeout ); // first receive 00184 00185 #ifdef USE_MESSAGE_RECORDER 00186 if ( _MR_RecordingState != Replay ) 00187 { 00188 #endif 00189 00190 // L1-2 Update (nothing to do in replay mode) 00191 CBufServer::update (); // then send 00192 00193 #ifdef USE_MESSAGE_RECORDER 00194 } 00195 #endif 00196 00197 } |
|
Definition at line 45 of file callback_server.cpp.
00046 { 00047 nlassert (data != NULL); 00048 CCallbackServer *server = (CCallbackServer *)data; 00049 00050 nldebug("LNETL3S: newConnection()"); 00051 00052 #ifdef USE_MESSAGE_RECORDER 00053 // Record connection 00054 server->noticeConnection( from ); 00055 #endif 00056 00057 // send all my association to the new client 00058 // association are disactivated so we don t need to send them 00059 // server->sendAllMyAssociations (from); 00060 00061 // call the client callback if necessary 00062 if (server->_ConnectionCallback != NULL) 00063 server->_ConnectionCallback (from, server->_ConnectionCbArg); 00064 } |
|
Definition at line 272 of file buf_server.h. Referenced by NLNET::CBufServer::CBufServer(). |
|
Definition at line 271 of file buf_server.h. |
|
Definition at line 273 of file buf_server.h. Referenced by NLNET::CBufServer::addNewThread(). |
|
Definition at line 148 of file buf_net_base.h. |
|
Definition at line 167 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::CCallbackNetBase(), NLNET::CCallbackNetBase::getBytesReceived(), and NLNET::CCallbackNetBase::processOneMessage(). |
|
Definition at line 167 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::CCallbackNetBase(), and NLNET::CCallbackNetBase::getBytesSent(). |
|
Definition at line 196 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::addCallbackArray(), and NLNET::CCallbackNetBase::processOneMessage(). |
|
Connection callback.
Reimplemented from NLNET::CBufServer. Definition at line 100 of file callback_server.h. Referenced by NLNET::cbsNewConnection(). |
|
Argument of the connection callback.
Reimplemented from NLNET::CBufServer. Definition at line 101 of file callback_server.h. Referenced by NLNET::cbsNewConnection(). |
|
Definition at line 199 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::processOneMessage(), and NLNET::CCallbackNetBase::setDefaultCallback(). |
|
Definition at line 202 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::baseUpdate(). |
|
Definition at line 188 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::baseUpdate(), NLNET::CCallbackNetBase::getSIDA(), and NLNET::CCallbackNetBase::ignoreAllUnknownId(). |
|
Definition at line 201 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::isAServer(). |
|
Used by client and server class.
Definition at line 170 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::CCallbackNetBase(). |
|
Definition at line 193 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::addCallbackArray(), NLNET::cbnbMessageAskAssociations(), NLNET::CCallbackNetBase::displayAllMyAssociations(), and NLNET::CCallbackNetBase::processOneMessage(). |
|
Definition at line 232 of file callback_net_base.h. Referenced by NLNET::CCallbackNetBase::CCallbackNetBase(). |