#define UDP_MAX_PORT    65535

class CUDPMessageQueue:CQueue
{ // each bound socket queues data. recv functions & handler use this.
        U8                                              *data;                          // contains the UDP payload data.
        I64                                              data_length;           // size of payload data.
        I64                                              received_length;       // amount of the data received so far.
        CSocketAddressStorage    from_address;  // when UDP Handler sees UDP packet, this is filled with where packet came from.
                                                                                        // recvfrom uses this to fill its address_out parameter.
};

class CUDPSocket
{
        CSocket                                 *socket;
        CUDPMessageQueue                *receive_queue;
        CSocketAddressStorage    receive_address;       // based on ->family, cast or assign to a var as IPV4/IPV6 CSocketAddress
        I64                                              receive_timeout_ms;
        I64                                              receive_max_timeout;
        U16                                              bound_to;                      // represents the currently bound port
};

class CUDPTreeQueue:CQueue
{
        CUDPSocket              *socket;
};

class CUDPTreeNode:CBST
{
        CUDPTreeQueue   *queue;
};

class CUDPRepEntry:CQueue
{
        CUDPTreeNode *node;
};

class CUDPHeader
{
        U16 source_port;
        U16 destination_port;
        U16 length;
        U16 checksum;
};


class CUDPGlobals
{

        CUDPTreeNode *bound_socket_tree;

} udp_globals;