void AcceptCallback(IAsyncResult ar) { HttpSocketState state = (HttpSocketState)ar.AsyncState; try { Socket client = state.Socket.EndAccept(ar); Thread.Sleep(1); _reset.Set(); state.Socket = client; } catch (NullReferenceException) { if (state != null) { state.Dispose(); } state = null; } catch (SocketException e) { Logger.Error(e, $"Error accepting client. SocketErrorCode: {e.SocketErrorCode}"); if (state != null) { state.Dispose(); } state = null; return; } WaitForData(ref state); }
private void WaitForData(ref HttpSocketState state) { Thread.Sleep(10); try { state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, OnDataReceived, state); } catch (NullReferenceException) { if (state != null) { state.Dispose(); } state = null; } catch (ObjectDisposedException) { if (state != null) { state.Dispose(); } state = null; } catch (SocketException e) { if (e.SocketErrorCode == SocketError.NotConnected) { if (state != null) { state.Dispose(); } state = null; return; } if (e.SocketErrorCode != SocketError.ConnectionAborted && e.SocketErrorCode != SocketError.ConnectionReset) { LogError(Category, "Error receiving data"); LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e)); } if (state != null) { state.Dispose(); } state = null; return; } }
void AcceptCallback(IAsyncResult ar) { HttpSocketState state = (HttpSocketState)ar.AsyncState; try { Socket client = state.Socket.EndAccept(ar); Thread.Sleep(1); _reset.Set(); state.Socket = client; } catch (NullReferenceException) { if (state != null) { state.Dispose(); } state = null; } catch (SocketException e) { LogError(Category, "Error accepting client"); LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e)); if (state != null) { state.Dispose(); } state = null; return; } WaitForData(ref state); }
private void OnDataReceived(IAsyncResult async) { HttpSocketState state = (HttpSocketState)async.AsyncState; if (state == null || state.Socket == null) { return; } try { int received = state.Socket.EndReceive(async); if (received == 0) { return; } HttpRequest request; using (var ms = new MemoryStream(state.Buffer, 0, received)) request = HttpHelper.GetRequest(ms); Logger.Info("Data received: " + Encoding.UTF8.GetString(state.Buffer, 0, received).Replace('\n', ' ').Replace('\r', ' ')); using (var ms = new MemoryStream(state.Buffer)) { if (request.Url.EndsWith("news.txt")) { HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/Russiandow_news.txt", Encoding.Unicode)); goto END; } if (request.Url.StartsWith("/motd/motd")) { HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/Russiandow_news.txt", Encoding.Unicode)); goto END; } if (request.Url.StartsWith("/motd/vercheck")) { //HttpHelper.WriteResponse(ms, HttpResponceBuilder.Text(@"\newver\1\newvername\1.4\dlurl\http://127.0.0.1/NewPatchHere.exe")); HttpHelper.WriteResponse(ms, HttpResponceBuilder.Text(@"\newver\0")); goto END; } if (request.Url.EndsWith("LobbyRooms.lua")) { HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/LobbyRooms.lua", Encoding.ASCII)); goto END; } if (request.Url.EndsWith("AutomatchDefaultsSS.lua") || request.Url.EndsWith("AutomatchDefaultsDXP2Fixed.lua")) { HttpHelper.WriteResponse(ms, HttpResponceBuilder.File("Resources/Files/AutomatchDefaults.lua", Encoding.ASCII)); goto END; } if (request.Url.EndsWith("homepage.php.htm")) { if (StatsResponce == null || (DateTime.Now - _lastStatsUpdate).TotalMinutes > 5) { StatsResponce = BuildTop10StatsResponce(); } HttpHelper.WriteResponse(ms, StatsResponce); goto END; } if (request.Url.StartsWith("/all")) { HttpHelper.WriteResponse(ms, BuildAllStatsResponce()); goto END; } HttpHelper.WriteResponse(ms, HttpResponceBuilder.NotFound()); END: // Завершение отправки var length = (int)ms.Position; ms.Position = 0; state.Socket.Send(state.Buffer, 0, length, SocketFlags.None); state.Dispose(); } } catch (ObjectDisposedException) { if (state != null) { state.Dispose(); } state = null; return; } catch (SocketException e) { switch (e.SocketErrorCode) { case SocketError.ConnectionReset: case SocketError.Disconnecting: case SocketError.NotConnected: case SocketError.TimedOut: if (state != null) { state.Dispose(); } state = null; return; default: Logger.Error(e, $"Error receiving data. SocketErrorCode: {e.SocketErrorCode}"); if (state != null) { state.Dispose(); } state = null; return; } } catch (Exception e) { Logger.Error(e, $"Error receiving data"); } // and we wait for more data... CONTINUE : WaitForData(ref state); }