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); } }