[ENet-discuss] Multithreading: dealing with enet_host_service blocking

Chris Jurney jurney at gmail.com
Tue Sep 14 11:09:47 PDT 2010


We divide receiving and sending like this (see below) to get all incoming
packets before sending outgoing.  This function is called once per game
frame.  This also makes sure any acks to received reliable packets are
packed in with your send before you send.  That ended up being a huge
bandwidth saver for us when trying to send 30 updates a second (it cut the
number of packets in half, thus half the IP/UDP overhead).  The main piece
we added to enet to make this work was a 4th parameter to enet_host_service
that lets of disallow it from sending commands.  If people are interested, I
can post a diff or submit this somehow.

The aggregation bit around the flush is where we merge multiple frames worth
of packets for large games (if there are more than 4 players, we only send
15 times per second).


void Socket::_ServiceOnce(bool allowSend)
{
    ENetEvent event;
    while ( enet_host_service(m_pNetwork, &event, 0, 0) > 0 )
    {
        m_aEventQueue.AddData(event);
    }
    if (allowSend)
    {
        m_fullServiceCount += 1;
        if (++m_curAggregation >= m_maxAggregation)
        {
            m_curAggregation = 0;
            enet_host_flush(m_pNetwork, 1);
        }
    }
}


Chris


On Mon, Sep 13, 2010 at 2:12 PM, Beau Albiston <BAlbiston at totimm.com> wrote:

>  Hello All,
>
>
>
> I’m particularly interested in how people are dealing with the
> enet_host_service blocking on receive when you have things to send…
>
>
>
> I have solved this problem already, but was curious as to how others have
> solved the same problem.  My solution involved making (only for Win32 in my
> case) modifications to the enet_socket_wait function to allow waiting on
> socket send and receive, as well as a “cancel wait” event object (using
> WSAEventSelect, and WSAWaitForMultipleObjects).  I then added an additional
> function (enet_socket_cancel_wait) that signals the “cancel wait” event
> object and wakes the network thread.  From there, the enet_host_service
> function returns with a timeout event from which I can then pluck a queued
> send command from my queue (using lock-free queues).  So, my main thread
> queues a send command and then calls enet_socket_cancel_wait to wake the
> network thread (in case it is waiting on recv) to process the send command.
>
>
>
> (Lee, if you’re interested in the changes, I can send them to you.)
>
>
>
> Thanks,
>
> -Beau
>
> _______________________________________________
> ENet-discuss mailing list
> ENet-discuss at cubik.org
> http://lists.cubik.org/mailman/listinfo/enet-discuss
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cubik.org/pipermail/enet-discuss/attachments/20100914/7d9d006b/attachment.html>


More information about the ENet-discuss mailing list