private void DataReceived(IAsyncResult res) { if (_alive) { var endPoint = (IPEndPoint)res.AsyncState; try { var data = _client.EndReceive(res, ref endPoint); if (data.Length > 0) { var message = Message.Deserialise(data); var connectionId = message.ConnectionId.GetString(); if (!string.IsNullOrEmpty(connectionId)) { UdpAddress from; if (!_addresses.TryGetValue(connectionId, out from)) { from = new UdpAddress(endPoint.Address.ToString(), endPoint.Port); _addresses[connectionId] = from; } HandleMessage(message, from); } } } catch { // Needs to stay alive } ReceiveData(endPoint); } }
private void Send(UdpAddress address, byte[] data) { var send = new Task(() => { lock (_client) { var res = _client.Send(data, data.Length, address.Host, address.Port); if (res != data.Length) { throw new Exception("Did not send the entire message"); } } }); send.Start(); }