使用c中的套接字发送大文件时出现问题

时间:2012-02-21 20:54:55

标签: c sockets webserver

所以我正在用C编写一个简单的Web服务器,现在我想弄清楚如何传输更大的文件。我正试图用一个大约40MB的文件做这件事而且我遇到了一个分段错误(至少那是wget告诉我的!)

问题是,程序本身从来没有给我一个错误,它只是退出,只有当我尝试使用wget获取文件时,wget表示它在seg错误中出错。这是发送文件的代码:

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 个答案:

答案 0 :(得分:1)

fread不会终止字符串。您需要使用bytes_read作为要发送的length参数,而不是strlen。

您还需要在尝试打印之前对字符串进行空终止,或者使用%s格式化程序提供长度。例如:printf(“Buffer(%d):%。* s \ n \ n”,bytes_read,bytes_read,file_buffer);

答案 1 :(得分:1)

您不应该使用strlen(file_buffer)来指定要发送的字节数;这会在许多情况下中断,并且在发送的文件大于缓冲区时总会中断。为什么不使用bytes_read来指定要发送的字节数?