Передача файлов через сокеты, заключительный размер с меньшим количеством байтов

Проверьте это, я проверил.

  //put all paths in array reading line by line
  string[] paths = System.IO.File.ReadAllLines(@"path-to\list.txt");

  //get line by line paths
  foreach (string path in paths)
  {
        if (Directory.Exists(path))
        {
            //deletes all files and parent
            //recursive:true, deletes subfolders and files
            Directory.Delete(path, true);
            //create parent folder
            Directory.CreateDirectory(path);
        }

   }//end outer for
6
задан Hernán 27 March 2009 в 05:43
поделиться

1 ответ

Передающий предоставленный код игнорирует факт, которые пишут () (или отправляют ()) на сокете, не обязан записать целый буфер.

запишите ()/, отправляют (), мог бы решить записать это частично или не запись вообще, если базовая подсистема отказывается получать больше данных (например, сетевая подсистема может иметь очередь для данных для отправки, и эта очередь уже полна). Это очень вероятно на медленном соединении.

Передающая сторона должна проверить возвращаемое значение записи () для обнаружения, сколько данных было на самом деле записано и корректируется соответственно.

Запись должна быть сделана так или иначе как это:

int readAmount;
while( readAmount = read(file_fd, buffer, BUFSIZE) > 0 )
{
    int totalWritten = 0;
    do {
       int actualWritten;
       actualWritten = write (sdaccept, buffer + totalWritten, readAmount - totalWritten);
       if( actualWritten == - 1 ) {
           //some error occured - quit;
       }
       totalWritten += actualWritten;
    } while( totalWritten < readAmount );
}
11
ответ дан 9 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: