Проблемы с отправкой большого файла с использованием сокетов в C - PullRequest
2 голосов
/ 22 февраля 2012

Итак, я работаю над написанием простого веб-сервера на C, и теперь я пытаюсь понять, как передавать файлы большего размера. Я пытаюсь сделать это с файлом ~ 40 МБ прямо сейчас, и я получаю ошибку сегментации (по крайней мере, это то, что говорит мне wget!)

Дело в том, что сама программа никогда не выдаёт мне ошибку, она просто завершает работу, только когда я пытаюсь получить файл с помощью wget, wget сообщает, что она выдает ошибку в ошибке сегмента. Вот код, который отправляет файл:

while( 1 ) {
  int bytes_read = fread( file_buffer, 1, BUFFER_SIZE, f );
  printf( "Bytes read: %d\n", i * 1024 );
  if ( bytes_read == 0 ) {
    if ( logging > 0 ) {
      printf( "End of file reached...\n" );
    }
    break;
  } else {
    send( client, file_buffer, strlen( file_buffer ), 0 );
if ( logging > 1 ) {
      printf( "Buffer (%d): %s\n\n", bytes_read, file_buffer );
    }
  }
  i++;
}

Есть идеи, что не так? Он отлично работает с небольшими файлами, но только не с этим. О, и число прочитанных байтов меняется каждый раз, когда я пытаюсь, оно колеблется от 240000 до 770000. Мысли? Спасибо!

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Вы не должны использовать strlen (file_buffer), чтобы указать, сколько байтов отправлять;это сломается при многих обстоятельствах и всегда сломается, когда отправляемый файл больше вашего буфера.Почему бы просто не использовать bytes_read для указания количества отправляемых байтов?

1 голос
/ 22 февраля 2012

fread не завершает строки Вам нужно использовать bytes_read в качестве параметра длины для отправки, а не strlen.

Вам также необходимо либо завершить строку нулем, прежде чем пытаться ее распечатать, либо указать длину с помощью средства форматирования% s. Например: printf ("Буфер (% d):%. * S \ n \ n", bytes_read, bytes_read, file_buffer);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...