【问题标题】:Sending files over winsock/linux sockets通过 winsock/linux 套接字发送文件
【发布时间】:2011-07-28 18:59:36
【问题描述】:

嘿,我正在制作一个发送/接收文件的简单程序,我的代码发送文本文件,但是当涉及到二进制时它开始出现错误,代码:

static void
send_event(conn,file)
  void *conn;
  void *file;
{
   FILE *f;
   char *buffer;
   int32_t block_size;
   int32_t size;
   size_t __read;
   ConnectionQueue *q;
   f = (FILE *)file;
   q = (ConnectionQueue *)conn;
   block_size = conf_getint("transfer:block_size");
   if (block_size <= 1 || block_size > 1024)
     {
       abort();
       return;
     }
   buffer = (char *)MyMalloc(block_size);
   if (!q || !f)
     return;

   fseek(f,0L,SEEK_END);
   size = ftell(f);
   if (size == 0L)
     {
       send_socket(q->conn,"RECEIVE: 302 FSE");
       return;
    }
   fseek(f,0,SEEK_SET);
   while (true)
    {
      if (q->abort)
       {
         send_socket(q->conn,"RECEIVE: File transfer aborted\n");
         if (f)
           fclose(f);
         f = NULL;
         MyFree(buffer);
         return;
       }
      __sleep(100);
       __read = fread(buffer,sizeof(char),512,f);
       if (__read <= 0)
         {
           send_socket(q->conn,"RECEIVE: EOF\n");
           break;
         }
      if (*buffer == '\0')
        {
          send_socket(q->conn,"RECEIVE: EOF\n");
          break;
        }

      send_socket(q->conn,"RECEIVE: %s\n",buffer);
   }
   send_socket(q->conn,"RECEIVE: 915 EOF\n");
   fclose(f);
   f = NULL;
   MyFree(buffer);
}

已修复:请检查我的回答 \/

【问题讨论】:

    标签: c


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      K&R 语法和void * 参数有什么用?

      static void send_event( ConnectionQueue * conn, FILE * file) {
      ....
      

      在二进制 vs 文本上,这通常是因为您使用“r”而不是“rb”作为模式打开文件。

       __read = fread(buffer,sizeof(char),512,f);
      

      你应该在那里使用block_size 而不是512

      if (*buffer == '\0')
      ...
      send_socket(q->conn,"RECEIVE: %s\n",buffer);
      

      您的“二进制文件”可能包含 0 - 这不是一个好的 EOF 标记,如果您在 send_socket 中使用 strlen,您的数据会在缓冲区的第一个 0 处被截断。

      【讨论】:

      • 谢谢,请查看我的回答,现在一切都很好,不过我投票给你了
      猜你喜欢
      • 2015-03-16
      • 2011-02-24
      • 2012-07-12
      • 2015-08-28
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多