'Read a datagram, extract the message in it and trigger the associated
Deferred.'

def datagramReceived(self, data, addr):

    m = Message()
    try:
        m.fromStr(data)
    except EOFError:
        log.msg(('Truncated    packet    (%d    bytes)    from    %s' % (len(data), addr)))
        return
    except:
        log.err(failure.Failure(), 'Unexpected    decoding    error')
        return
    if (m.id in self.liveMessages):
        (d, canceller) = self.liveMessages[m.id]
        del self.liveMessages[m.id]
        canceller.cancel()
        try:
            d.callback(m)
        except:
            log.err()
    elif (m.id not in self.resends):
        self.controller.messageReceived(m, self, addr)
