internal void ReceiveRequestCompleted(IAsyncResult ar)
        {
            IPEndPoint masterEndPoint = null;

            byte[] frame;

            try
            {
                frame = _client.EndReceive(ar, ref masterEndPoint);
            }
            catch (ObjectDisposedException)
            {
                // this hapens when slave stops
                return;
            }

            ModbusUdpSlave slave = (ModbusUdpSlave)ar.AsyncState;

            _log.DebugFormat("Read Frame completed {0} bytes", frame.Length);
            _log.InfoFormat("RX: {0}", StringUtility.Join(", ", frame));

            IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(CollectionUtility.Slice(frame, 6, frame.Length - 6));

            request.TransactionID = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 0));

            // TODO refactor
            ModbusUdpTransport transport = new ModbusUdpTransport();
            // perform action and build response
            IModbusMessage response = slave.ApplyRequest(request);

            response.TransactionID = request.TransactionID;

            // write response
            byte[] responseFrame = transport.BuildMessageFrame(response);
            _log.InfoFormat("TX: {0}", StringUtility.Join(", ", responseFrame));
            _client.BeginSend(responseFrame, responseFrame.Length, masterEndPoint, WriteResponseCompleted, null);
        }
        internal void ReceiveRequestCompleted(IAsyncResult ar)
        {
            IPEndPoint masterEndPoint = null;
            byte[] frame;

            try
            {
                frame = _client.EndReceive(ar, ref masterEndPoint);
            }
            catch (ObjectDisposedException)
            {
                // this hapens when slave stops
                return;
            }

            ModbusUdpSlave slave = (ModbusUdpSlave) ar.AsyncState;

            _log.DebugFormat("Read Frame completed {0} bytes", frame.Length);
            _log.InfoFormat("RX: {0}", StringUtility.Join(", ", frame));

            IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(CollectionUtility.Slice(frame, 6, frame.Length - 6));
            request.TransactionID = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 0));

            // TODO refactor
            ModbusUdpTransport transport = new ModbusUdpTransport();
            // perform action and build response
            IModbusMessage response = slave.ApplyRequest(request);
            response.TransactionID = request.TransactionID;

            // write response
            byte[] responseFrame = transport.BuildMessageFrame(response);
            _log.InfoFormat("TX: {0}", StringUtility.Join(", ", responseFrame));
            _client.BeginSend(responseFrame, responseFrame.Length, masterEndPoint, WriteResponseCompleted, null);
        }