/// <summary>
        /// Called when a ReceiveAsyncFrom operation completes
        /// </summary>
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            try
            {
                if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
                {
                    packetsReceived++;
                    bytesReceived += e.BytesTransferred;
                    var request = e.UserToken as DnsRequestListenerSession;
                    // Handle this request
                    var responseBytes = DnsRequestProcessor.ProcessReceivedData(request);
                    if (responseBytes > 0)
                    {
                        request.SocketAsyncEventArgs.SetBuffer(0, responseBytes);
                        request.Socket.SendAsync(e);
                        return;
                    }
                }
            }
            catch (Exception ex) {
                // In case of an exception, close the socket
            }

            // Start listening again
            this.CloseClientSocket(e);
        }
        /// <summary>
        /// Called when a ReceiveAsyncFrom operation completes
        /// </summary>
        private void ProcessReceiveFrom(SocketAsyncEventArgs e)
        {
            try
            {
                if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
                {
                    packetsReceived++;
                    bytesReceived += e.BytesTransferred;

                    var request = e.UserToken as DnsRequestListenerSession;
                    // Handle this request
                    var responseBytes = DnsRequestProcessor.ProcessReceivedData(request);
                    if (responseBytes > 0)
                    {
                        request.SocketAsyncEventArgs.SetBuffer(0, responseBytes);
                        this.listenerSocket.SendToAsync(e);
                    }
                }
                else
                {
                    // Start listening again
                    e.SetBuffer(0, e.Buffer.Length);
                    this.listenerSocket.ReceiveFromAsync(e);
                }
            }
            catch {
                // In case of an exception, start listening again
                e.SetBuffer(0, e.Buffer.Length);
                this.listenerSocket.ReceiveFromAsync(e);
            }
        }