Запись в файл работает только в режиме «step in»? - PullRequest
2 голосов
/ 12 апреля 2020

Привет всем! У меня проблема с приложением FTP, которое я пытаюсь создать. Я построил клиент в C# и мой сервер в C. Для моего клиента я использую Visual Studio 2015. Мой код прекрасно работает, когда я использую функции режима отладки «шаг за шагом / выход». Проблема возникает, когда клиент пытается загрузить файл. Сервер отправляет все содержимое файла, а клиент получает все это содержимое, но по какой-то причине только около 70% файла записывается в FileStream.

мой код указан ниже:

public void download(string baseCom,string downloadPlace)
        {
            //baseCom is the main command
            //downloadPlace is location to download file from including name

            sendCommand(baseCom);
            FileStream myStream = File.Create(downloadPlace);
            int bytesRead = 0;
            byte[] myByte = new byte[1024];
            do
            {
                bytesRead = ourSock.Receive(myByte, myByte.Length, 0);
                myStream.Write(myByte, 0, bytesRead);



            } while ((bytesRead > 0) && (bytesRead == 1024)) ;


            myStream.Flush();
            myStream.Close();
            }

Я новичок в C# и сетевом программировании в целом, поэтому я благодарен всем вам за помощь. Часть меня считает, что каким-то образом при регулярном запуске программы некоторые данные остаются «оставшимися» в потоке сокетов.

1 Ответ

2 голосов
/ 13 апреля 2020
((bytesRead > 0) && (bytesRead == 1024))

, кажется, проблема здесь.

Запрос операции чтения для 1024 байтов не гарантирует, что вы получите 1024 байта.

Вы можете получить любое количество байтов между 0 и 1024 (0 означает конец передачи), и когда это так, (допустим, буфер чтения имеет только 768 байт), вы просто прекращаете чтение.

Итак, если это произойдет, когда половина файла будет получена (все считано 1024 байта), у вас не будет оставшейся половины и вы сохраните полученную информацию.

Пожалуйста, измените это:

while (bytesRead > 0);
...