【问题标题】:Trouble sending a large file using sockets in c在 c 中使用套接字发送大文件时遇到问题
【发布时间】:2012-02-21 20:54:55
【问题描述】:

所以我正在用 C 语言编写一个简单的 Web 服务器,现在我正在尝试弄清楚如何传输更大的文件。我现在正在尝试使用 ~40MB 的文件来执行此操作,但遇到了分段错误(至少 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 不等。想法?谢谢!

【问题讨论】:

  • 好吧,首先,您不能在二进制流上使用 strlen ——它将在第一个 0 字节处停止。您在发送调用中没有使用 bytes_read 是否有原因?

标签: c sockets webserver


【解决方案1】:

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

【讨论】:

  • 糟糕,抱歉,当我从旧版本的代码升级时,这绝对是一个错误。我将其更改为 bytes_read ,但问题仍然存在?
  • @Pete.Mertz:您的问题仍然存在,因为您尝试将 file_buffer 打印为以空字符结尾的字符串,而它不是以空字符结尾的字符串。请参阅我在答案中添加的关于如何解决该问题的编辑。
【解决方案2】:

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

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

【讨论】:

  • 嘿,我做了这些更正仍然无济于事。我也试过注释掉所有的打印行。会不会是可用内存问题?
  • 严重怀疑。向我们展示更多代码,尤其是 file_buffer 和 BUFFER_SIZE 的声明和初始化。此外,fread() 返回 size_t,而不是 int,并且您提到此故障发生在大文件中。请记住,在许多平台上 size_t 与 int 的大小不同。你使用什么操作系统和编译器,你编译的比特大小是多少?
猜你喜欢
  • 2012-01-30
  • 2011-08-01
  • 1970-01-01
  • 2022-01-14
  • 2016-06-03
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多