public void SendFilesToAsync(IPEndPoint ipEndPoint, string[] files, SendFilesProgress progress, object state,
                              SendFilesComplete complete)
 {
     new Thread(new ThreadStart(() =>
     {
         try
         {
             SendFilesTo(ipEndPoint.Address, files, state, progress);
             if (complete != null)
             {
                 complete(state, null);
             }
         }
         catch (Exception e)
         {
             if (complete != null)
             {
                 complete(state, e);
             }
         }
     })).Start();
 }
        public void SendFilesTo(IPAddress ipAddress, string[] files, object state, SendFilesProgress progress)
        {
            SendFiles sendFiles = new SendFiles();

            sendFiles.Count       = files.Length;
            sendFiles.UserAddress = new UserAddress()
            {
                Address = Helper.LocalIPAddress(), Port = DefaultPort
            };
            sendFiles.Size = 0;

            long totalSize = 0, sentTotal = 0, sentCurrent = 0;

            foreach (string file in files)
            {
                FileInfo fileInfo = new FileInfo(file);
                sendFiles.Files.Add(new SendFile()
                {
                    Name = fileInfo.Name,
                    Size = fileInfo.Length
                });

                sendFiles.Size += fileInfo.Length / 1024;
                totalSize      += fileInfo.Length;
            }

            using (TcpClient tcpClient = new TcpClient())
            {
                tcpClient.Connect(ipAddress, DefaultPort);

                byte[] buffer = Encoding.UTF8.GetBytes(Helper.XmlSerialize <SendFiles>(sendFiles));

                NetworkStream networkStream = tcpClient.GetStream();
                networkStream.Write(buffer, 0, buffer.Length);

                try
                {
                    byte[]        bytes         = new byte[1024];
                    StringBuilder stringBuilder = new StringBuilder();

                    int i;
                    while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        stringBuilder.Append(Encoding.UTF8.GetString(bytes, 0, i));
                        if (i < bytes.Length)
                        {
                            break;
                        }
                    }

                    // Sending files?
                    try
                    {
                        SendFilesData sendFilesData = Helper.XmlDeserialize <SendFilesData>(stringBuilder.ToString());

                        if ("allowed".Equals(sendFilesData.Status))
                        {
                            bool cancel = false;

                            foreach (string file in files)
                            {
                                // not open a file from user's desktop directory ???
                                using (FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
                                {
                                    sentCurrent = 0;

                                    while (!cancel && (i = fileStream.Read(bytes, 0, bytes.Length)) != 0)
                                    {
                                        networkStream.Write(bytes, 0, i);

                                        sentCurrent += i;
                                        sentTotal   += i;

                                        if (progress != null)
                                        {
                                            progress(file, ipAddress, sentCurrent, fileStream.Length, sentTotal, totalSize, state, out cancel);
                                        }
                                    }
                                }
                                if (cancel)
                                {
                                    throw new OperationCanceledException();
                                }
                            }
                        }
                        else
                        {
                            throw new AirDeniedException();
                        }
                    }
                    finally
                    {
                    }
                }
                finally
                {
                }
            }
        }
        public void SendFilesTo(IPAddress ipAddress, string[] files, object state, SendFilesProgress progress)
        {
            SendFiles sendFiles = new SendFiles();
            sendFiles.Count = files.Length;
            sendFiles.UserAddress = new UserAddress() { Address = Helper.LocalIPAddress(), Port = DefaultPort };
            sendFiles.Size = 0;

            long totalSize = 0, sentTotal = 0, sentCurrent = 0;

            foreach (string file in files)
            {
                FileInfo fileInfo = new FileInfo(file);
                sendFiles.Files.Add(new SendFile()
                {
                    Name = fileInfo.Name,
                    Size = fileInfo.Length
                });

                sendFiles.Size += fileInfo.Length / 1024;
                totalSize += fileInfo.Length;
            }

            using (TcpClient tcpClient = new TcpClient())
            {
                tcpClient.Connect(ipAddress, DefaultPort);

                byte[] buffer = Encoding.UTF8.GetBytes(Helper.XmlSerialize<SendFiles>(sendFiles));

                NetworkStream networkStream = tcpClient.GetStream();
                networkStream.Write(buffer, 0, buffer.Length);

                try
                {
                    byte[] bytes = new byte[1024];
                    StringBuilder stringBuilder = new StringBuilder();

                    int i;
                    while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        stringBuilder.Append(Encoding.UTF8.GetString(bytes, 0, i));
                        if (i < bytes.Length)
                            break;
                    }

                    // Sending files?
                    try
                    {
                        SendFilesData sendFilesData = Helper.XmlDeserialize<SendFilesData>(stringBuilder.ToString());

                        if ("allowed".Equals(sendFilesData.Status))
                        {
                            bool cancel = false;

                            foreach (string file in files)
                            {
                                // not open a file from user's desktop directory ???
                                using (FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
                                {
                                    sentCurrent = 0;

                                    while (!cancel && (i = fileStream.Read(bytes, 0, bytes.Length)) != 0)
                                    {
                                        networkStream.Write(bytes, 0, i);

                                        sentCurrent += i;
                                        sentTotal += i;

                                        if (progress != null)
                                        {
                                            progress(file, ipAddress, sentCurrent, fileStream.Length, sentTotal, totalSize, state, out cancel);
                                        }
                                    }
                                }
                                if (cancel)
                                {
                                    throw new OperationCanceledException();
                                }
                            }
                        }
                        else
                        {
                            throw new AirDeniedException();
                        }
                    }
                    finally
                    {
                    }
                }
                finally
                {
                }
            }
        }
 public void SendFilesToAsync(IPEndPoint ipEndPoint, string[] files, SendFilesProgress progress, object state,
     SendFilesComplete complete)
 {
     new Thread(new ThreadStart(() =>
         {
             try
             {
                 SendFilesTo(ipEndPoint.Address, files, state, progress);
                 if (complete != null)
                 {
                     complete(state, null);
                 }
             }
             catch (Exception e)
             {
                 if (complete != null)
                 {
                     complete(state, e);
                 }
             }
         })).Start();
 }