Example #1
0
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;

}