c# Файл передачи клиента Tcp с помощью sslStream

Я пытаюсь отправить файл с помощью sslStream клиента tcp. Файл около 250кб. Когда я не пишу dataLength в поток, сервер закрывает соединение из-за максимального размера приемного буфера. Когда я записываю в поток dataLength, у меня нет исключений, но у сервера есть ошибка типа (соединение изящно закрыто). Одна из причин заключается в том, что из-за события закрытия клиента Tcp сервер не может получить данные, которые я отправил; Вот мой код. Код сервера отсутствует, я знаю, что он был написан в Delphi с библиотекой indy sockets Вот мой код

TcpClient sendClient = new TcpClient(serverName, port);
        LingerOption lingerOption = new LingerOption(true, 20);
        sendClient.LingerState = lingerOption;
        using (SslStream sendStream = new SslStream(sendClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
        {

            try
            {

                sendStream.AuthenticateAsClient(serverName, null, SslProtocols.Ssl2, true);


                sendStream.Write(Encoding.UTF8.GetBytes("Login\r\n" + username + "\r\n" + password + "\r\n"));
                sendStream.Flush();
                int bytesResp = -1;
                byte[] buffer = new byte[1024];

                bytesResp = sendStream.Read(buffer, 0, buffer.Length);

                string response = Encoding.UTF8.GetString(buffer, 0, bytesResp);

                if (response.Trim() == "OK")
                {

                    sendStream.Write(Encoding.ASCII.GetBytes("Send\r\n"));

                    FileStream inputStream = File.OpenRead(filePath);
                    FileInfo f = new FileInfo(filePath);
                    int size = unchecked((int)f.Length);


                    byte[] byteSize = Encoding.ASCII.GetBytes(size.ToString());

                    sendStream.Write(byteSize);
                    sendStream.Write(Encoding.ASCII.GetBytes("\r\n"));

                    sendStream.Write(Encoding.ASCII.GetBytes(fileName + "\r\n"));







                    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    {

                        long sum = 0;
                        int count = 0;
                        byte[] data = new byte[1024];
                        while (sum < size)
                        {
                            count = fs.Read(data, 0, data.Length);
                            sendStream.Write(data, 0, count);
                            sum += count;

                            Array.Clear(data, 0, data.Length);
                        }
                        sendStream.Flush();
                    }
                    sendStream.Write(Encoding.UTF8.GetBytes("\r\n"));
                    sendStream.Write(Encoding.UTF8.GetBytes("Quit\r\n"));


                }

                MessageBox.Show("end the procedure");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            finally
            {
                if (sendClient.Client.Connected)
                {
                    sendClient.Client.Disconnect(false);
                    sendClient.Client.Dispose();
                }
            }

person user1654278    schedule 07.12.2015    source источник


Ответы (1)


Я не уверен, что это поможет, но у меня была аналогичная проблема с использованием(){}, которая по какой-то причине закрыла sslstream. Так что потенциально удалить

using (SslStream sendStream = new SslStream(sendClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null)){}

в

SslStream sendStream = new SslStream(sendClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
person Roger Speedy Reents Curbelo    schedule 13.10.2016