Отправка файлов через сокеты winsock / linux - PullRequest
0 голосов
/ 04 апреля 2011

Эй, я делаю простую программу, которая отправляет / получает файлы, мой код отправляет текстовые файлы, но когда дело доходит до двоичного файла, он начинает глючить, код:

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);
}

ИСПРАВЛЕНО: Пожалуйста, проверьте мой ответ \ /

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Что с синтаксисом K & R и параметрами void *?

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

В двоичном и текстовом типах это обычно происходит потому, что вы открываете файл, используя «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, и если выпри использовании strlen в send_socket ваши данные обрезаются при первых 0 в буфере.

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