public void ServerLoop() { m_StopServer = false; m_Listener.Start(); while (!m_StopServer) { Task <TcpClient> clientTask = m_Listener.AcceptTcpClientAsync(); while (!clientTask.IsCompleted) { if (m_StopServer) { break; } Thread.Sleep(500); } if (m_StopServer) { break; } if (clientTask.IsFaulted || clientTask.IsCanceled) { continue; } TcpClient client = clientTask.Result; string tempFile = GetTempFile(); try { byte[] modLen = new byte[sizeof(int)]; client.GetStream().Read(modLen, 0, modLen.Length); int moduleTargetLength = BitConverter.ToInt32(modLen, 0); byte[] mod = new byte[moduleTargetLength]; client.GetStream().Read(mod, 0, mod.Length); ProjectConfig target = ProjectConfig.Deserialize(Encoding.UTF8.GetString(mod)); client.GetStream().Read(modLen, 0, modLen.Length); int dataLength = BitConverter.ToInt32(modLen, 0); Stream s = File.Create(tempFile); for (int i = 0; i < dataLength; i++) { s.WriteByte(( byte )client.GetStream().ReadByte()); } s.Close(); m_Manager.AddPackage(target, tempFile); File.Delete(tempFile); byte[] response = Encoding.UTF8.GetBytes("Success."); client.GetStream().Write(BitConverter.GetBytes(response.Length), 0, sizeof(int)); client.GetStream().Write(response, 0, response.Length); } catch (Exception e) { if (File.Exists(tempFile)) { File.Delete(tempFile); } byte[] response = Encoding.UTF8.GetBytes(e.Message); client.GetStream().Write(BitConverter.GetBytes(response.Length), 0, sizeof(int)); client.GetStream().Write(response, 0, response.Length); } client.Close(); } Directory.Delete(m_TempStagingDirectory, true); }