private static void ReceiveCallback(IAsyncResult ar)
        {
            ReceiveState state = (ReceiveState)ar.AsyncState;

            try
            {
                state.m_socketObj.EndReceive(ar);
                state.m_receivedFlag = true;
            }
            catch (Exception ex)
            {
                state.m_receivedFlag = false;
                return;
                //throw new UDPClientException("Error trying to get response from server", ex, UDPClientError.BadResponse);
            }
        }
        private byte[] Transmit(byte[] request, int responseSize, bool doRetry)
        {
            ReceiveState state = new ReceiveState(m_client, m_received);
            int          retry = 0;

            if (m_client.Connected == false)
            {
                return(null);
            }

            byte[] response = new byte[MAX_RESPONSE_SIZE];
            List <ArraySegment <byte> > recvBuffers = new List <ArraySegment <byte> >();

            for (int seg = 0; seg < 100; seg++)
            {
                recvBuffers.Add(new ArraySegment <byte>(response, seg * 65535, 65535));
            }
            while (retry <= MAX_RETRIES)
            {
                m_client.Send(request);

                m_client.DontFragment = true;
                m_received            = false;
                m_client.BeginReceive(recvBuffers, SocketFlags.None,
                                      new AsyncCallback(ReceiveCallback), state);

                DateTime transmitBegin = DateTime.Now;
                TimeSpan timeWaiting   = new TimeSpan(0, 0, 0);
                while ((timeWaiting.TotalMilliseconds < EXPECTED_TIMEOUT[retry]) && (!state.m_receivedFlag))
                {
                    System.Threading.Thread.Sleep(1000);
                    timeWaiting = DateTime.Now - transmitBegin;
                }
                m_received = state.m_receivedFlag;

                if (m_received == false)
                {
                    if (doRetry)
                    {
                        retry++;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }

            m_received = false;
            if (retry > MAX_RETRIES)
            {
                return(null);            // we exhaust tentatives return null
            }
            else
            {
                return(response);
            }
        }