private void ReceiveCallback(IAsyncResult ar) { EndPoint source = new IPEndPoint(0, 0); int bytesRead = 0; try { bytesRead = _socket.EndReceiveFrom(ar, ref source); } catch (SocketException) { return; } // Parse the message if (source.Equals(_targetEndPoint) && bytesRead > 0) { try { byte[] b = (byte[])ar.AsyncState; _packetProtocol.DataReceived(b, bytesRead); } catch (ProtocolViolationException e) { _packetProtocol.MessageArrived = null; _packetProtocol = new PacketProtocol <TMessageType>(_bufferSize); _packetProtocol.MessageArrived = (MessageType, data) => OnMessageReceived(MessageType, data); } } // Start receiving more data StartReceive(); }