/// <summary> /// Handles everything from client /// </summary> /// <param name="commandClient"></param> /// <param name="dataClient"></param> private void ClientHandler(TcpClient dataClient) { string clientAddress = dataClient.Client.RemoteEndPoint.ToString(); try { using (NetworkStream dataStream = dataClient.GetStream()) { while (ServerStatus) { byte[] networkBuffer = new byte[4096]; //buff byte[] package; using (MemoryStream ms = new MemoryStream()) { int numBytesRead = dataStream.Read(networkBuffer, 0, networkBuffer.Length); if (!ServerStatus) { return; } if (numBytesRead == 0) { break; } int totalSize = BitConverter.ToInt32(networkBuffer, 0); ms.Write(networkBuffer, 0, numBytesRead); int readNow; while ((numBytesRead += (readNow = dataStream.Read(networkBuffer, 0, networkBuffer.Length))) != totalSize) { ms.Write(networkBuffer, 0, readNow); } ms.Write(networkBuffer, 0, readNow); package = ms.ToArray(); } int nameLen = 0; for (nameLen = 0; package[4 + nameLen] != '/'; nameLen++) { ; } string filename = Encoding.ASCII.GetString(package, 4, nameLen); byte[] imageStream = new byte[package.Length - 5 - nameLen]; Array.Copy(package, nameLen + 5, imageStream, 0, imageStream.Length); File.WriteAllBytes(SavePath + '/' + filename, imageStream); NetworkClient n = ConnectedClients.Single(c => c.Name == clientAddress); n.SentFiles++; n.TotalSize += imageStream.Length; } } } finally { if (ServerStatus) // if connection is still present { Application.Current.Dispatcher.Invoke((Action) delegate // <--- HERE { ConnectedClients.Remove(ConnectedClients.Single(c => c.Name == clientAddress)); }); } } }