TCP Отправка файла и закрытие NetworkStream C#

У меня возникла проблема. Я сделал TCP класс, отвечающий за общение между сервером и клиентом. Суть в том, что клиент отсылает серверу строку, тот ее обрабатывает и отсылает файл с результатом. Вот Функции клиента и сервера

Client

public void TcpClientConnect(string ip, int port, string itemFound)
{
    try
    {
        using TcpClient client = new(ip, port);
        using NetworkStream stream = client.GetStream();

        SendMessage(stream, itemFound);
        Log?.Invoke($"{DateTime.Now:T} Идет поиск \"{itemFound}\"");

        string response = RecvMessage(stream);
        Log?.Invoke($"{DateTime.Now:T} {response}");

        using (BinaryReader read = new(stream, Encoding.UTF8, true))
        {
            long length = read.ReadInt64();
            string name = read.ReadString();

            LoadFile(stream, length, name);
            Log?.Invoke($"{DateTime.Now:T} Файл загружен. Имя файла \"{name}\"");
        }
    }
    catch (Exception ex)
    {
        Log?.Invoke($"{DateTime.Now:T} {ex.Message}");
    }
}

client LoadFile

private void LoadFile(NetworkStream stream, long length, string name)
{
    using FileStream fs = File.Create($"{SavePath}\\{name}");

    long received = 0;
    byte[] bytes = new byte[1024];

    while (received < length)
    {
        int toReceive = (int)Math.Min(bytes.Length, length - received);

        int bytesReceived = stream.Read(bytes, 0, toReceive);
        if (bytesReceived == 0)
        {
            Log?.Invoke("Неожиданное завершение потока при получении файла");
            return;
        }

        received += bytesReceived;

        fs.Write(bytes, 0, bytesReceived);
    }
}

Server

public void TcpServerConnect(TcpClient _client)
{
    try
    {
        using TcpClient client = _client;
        using (NetworkStream stream = client.GetStream())
        {
            string itemSearch = RecvMessage(stream);
            Log?.Invoke($"{DateTime.Now:T} Поиск по слову \"{itemSearch}\"");

            string[] result = search.FoundString(itemSearch).Split(':'); //обработка строки + файл в архив

            if (result[0] == "0")
            {
                SendMessage(stream, "Результаты не обнаружены");
                Log?.Invoke($"{DateTime.Now:T} Результаты не обнаружены");

                return;
            }

            SendMessage(stream, $"Найдено: {result[0]}. Идет отправка файла");
            Log?.Invoke($"Найдено: {result[0]}. Идет отправка файла");

            LoadFile(stream, result[1]);
            Log?.Invoke($"Файл отправлен. Клиент отключился");

            File.Delete(result[1].Substring(0, result[0].Length - 4));
        }
    }
    catch (Exception ex)
    {
        Log?.Invoke($"{DateTime.Now:T} {ex.Message}");
    }
}

Server LoadFile

private void LoadFile(NetworkStream stream, string path)
{
    FileInfo file = new(path);
    if (!file.Exists)
    {
        Log?.Invoke($"Ошибка: Файл отправки не найден");
        return;
    }

    using (BinaryWriter bw = new(stream, Encoding.UTF8, true))
    {
        bw.Write(file.Length);
        bw.Write(file.Name);
        bw.Flush();
    }

    using FileStream fs = file.OpenRead();
    fs.CopyTo(stream);
}

Интересный факт, что файлы менее 100Мб отправляются, а вот уже выше иногда, чаще бывают косяки. По типу такого Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. Почему клиент закрывает соединение? Обработка файла может идти до 20 минут+


Ответы (0 шт):