Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Andrey Ushakov                       2:5020/400     20 Nov 2006  17:44:22
 To : Valentin Davydov
 Subject : Re: sendfile system call in FreeBSD
 -------------------------------------------------------------------------------- 
 
 Mon Nov 20 2006 11:29, Valentin Davydov wrote to Andrey Ushakov:
 
  VD> Дык, заверни на сервере read(2) в цикл и читай до тех пор, пока не вернёт
  VD> 0  либо ошибку.
 
 Hе получается так сделать. Дело в том что на этом диалог не завершается
 У меня дальше ещё вот:
 if((rc = recv(s, buf, sizeof(buf), MSG_WAITALL)) < 0)
 {
 printf("stcpcl: delivererd failed");
 exit(1);
 }
 Я жду уведомления о доставке. 
 
 Я пробовал после того как отправлю файл послать ещё маленькое сообщение
 серверу типа:
 if((rc = send(s, "endf", 4, 0)) < 0)
 {
 printf("stcpcl: ext send failed");
 exit(1);
 }
 Hо цикл на сервере:
 while((rc = read(s1, okmsg, (u_int)sizeof(okmsg))) > 0)
 {
  for(i = 0; i != rc; i++)
  {
    buf[itemp + i] = okmsg[i];     
  }
  itemp += rc;     
 }
 Почему-то воспринимает и данные передаваемого файла и последующего маленького
 сообщения как один и тот же поток. По моему это непрвильно. Либо это sendfile
 такой странный, либо я чё-то не понимаю =\
 
 Вот тут код целиком, а то не оч понятно что происходит:
 Часть клиента:
 while(rc != -1 && filesize > 0)
 {
   rc = sendfile(fd, s, offset, 0, (struct sf_hdtr *) NULL, &sbites, 0);
   filesize -= sbites;
   offset += sbites;   
 }
 
 /*посылаем маленькое сообщение
 if((rc = send(s, "endf", 4, 0)) < 0)
 {
   printf("stcpcl: send end file word failed");
   exit(1);
 }*/ /*Можно не посылать этого сообщения, всё равно цикл на сервере включит его
 в поток от sendfile()*/
 
 /*ожидаем уведомления о доставке*/
 printf("ok recive start\n");
 if((rc = recv(s, buf, sizeof(buf), MSG_WAITALL)) < 0)
 {
   printf("stcpcl: delivererd failed");
   exit(1);
 }
 
 Часть сервера:
 while((rc = recv(s1, okmsg, /*(u_int)*/sizeof(okmsg), 0)) > 0)
 {
   /*if(rc == 4)
   {
    okmsg[5] = '\0';
    if(!strcmp(okmsg, "endf"))
       break;
   }*//*это не поможет отловить маленькое сообщение в одном потоке, если только
       принимать данные кусками по 4 байта и не сравнивать каждый раз*/
 
   for(i = 0; i != rc; i++)
   {
    buf[itemp + i] = okmsg[i];     
   }
 
   itemp += rc;    
 }
 
 --- ifmail v.2.15dev5.3
  * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 sendfile system call in FreeBSD   Andrey Ushakov   20 Nov 2006 00:41:24 
 Re: sendfile system call in FreeBSD   Valentin Davydov   20 Nov 2006 13:29:57 
 Re: sendfile system call in FreeBSD   Andrey Ushakov   20 Nov 2006 17:44:22 
 Re: sendfile system call in FreeBSD   Vadim Goncharov   20 Nov 2006 20:15:52 
 Re: sendfile system call in FreeBSD   Andrey Ushakov   20 Nov 2006 22:54:27 
 sendfile system call in FreeBSD   Alex Semenyaka   20 Nov 2006 19:47:56 
 Re: sendfile system call in FreeBSD   Andrey Ushakov   20 Nov 2006 17:52:27 
Архивное /ru.unix.bsd/1667922570e72.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional