Esempio n. 1
0
        /// <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));
                    });
                }
            }
        }