bool UdpChain::sendPacket( long time , TSocket& socket , SBuffer& buffer , NetAddress& addr ) { if ( buffer.getFillSize() == 0 && time - mTimeLastUpdate > mTimeResendRel ) { if ( mBufferRel.getFillSize() == 0 ) return false; } uint32 outgoing = ++mOutgoingSeq; uint32 incoming = mIncomingAck; uint32 bufSize = (uint32)buffer.getFillSize(); if ( bufSize ) { if ( mBufferRel.getFreeSize() < bufSize ) { mBufferRel.grow( mBufferRel.getMaxSize() * 2 ); Msg( "UDPChain::sendPacket : ReliableBuffer too small" ); } size_t oldSize = mBufferRel.getFillSize(); mBufferRel.fill( outgoing ); mBufferRel.fill( incoming ); mBufferRel.fill( bufSize ); mBufferRel.append( buffer ); checkBuffer( mBufferRel.getData() , (int)mBufferRel.getFillSize() ); DataInfo info; info.size = (uint32)( mBufferRel.getFillSize() - oldSize ); info.sequence = outgoing; mInfoList.push_back( info ); buffer.clear(); mOutgoingAck = outgoing; } mBufferCache.clear(); try { if ( mOutgoingRel < mOutgoingAck ) { mBufferCache.append( mBufferRel ); } else { mBufferCache.fill( outgoing ); mBufferCache.fill( incoming ); mBufferCache.fill( 0 ); } int count = 0; while( mBufferCache.getAvailableSize() ) { int numSend = mBufferCache.take( socket , addr ); ++count; if ( count == 10 ) { return false; } } mTimeLastUpdate = time; } catch ( BufferException& ) { mBufferCache.resize( mBufferCache.getMaxSize() * 2 ); return false; } //Msg( "sendPacket %u %u %u" , outgoing , incoming , bufSize ); return true; }