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


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Valentin Davydov                     2:5020/400     20 Nov 2006  13:29:57
 To : Andrey Ushakov
 Subject : Re: sendfile system call in FreeBSD
 -------------------------------------------------------------------------------- 
 
 >   From: "Andrey Ushakov" <michaele@mail.yar.ru>
 >   Date: Sun, 19 Nov 2006 20:41:24 +0000 (UTC)
 >
 >Вроде подразобрался, и увидел проблему с использованием recv() и sendfile() в
 >связке.
 >
 >У меня в проге такой код
 >У клиента:
 >while(rc != -1 && filesize > 0)
 >{
 >rc = sendfile(fd, s, offset, 0, (struct sf_hdtr *) NULL, &sbites, 0);
 >filesize -= sbites;
 >offset += sbites;
 >}
 >Слизал из FTPD.C =)
 >
 >У сервера:
 >if((rc = recv(s1, buf, sizeof(buf), 0)) < 0)
 >{
 >perror("recv error");
 >exit(1);
 >}
 >
 >Если в вызове recv() оставить 0, то работать будет, но с очень маленькими
 >файликами. Я ставил вместо 0 MSG_WAITALL и убедился, что проблема в recv() она
 >возвращает управление до того как будет послан весь файл.
 
 man recv
      The receive calls normally return any data available, 
      up to the requested amount, rather than waiting for receipt of the full
      ^^^^^^^^^^^^^^^^^^^^^^^^^^
      amount requested;
 
 То есть recv() у тебя получает sizeof(buf) данных и с чувством выполненного
 долга сыто отваливается.
 
 >Соответственно в
 >клиенте имеем -1 и errno = 32
 >=\
 
 А что ещё прикажешь бедному sendfile() делать, когда с той стороны сокет
 закрылся?
 
 >В FTPD.C есть такая штука упомянутом выше while
 >if (err == -1){
 >if (!cnt)
 >goto oldway;
 >goto data_err;
 >}
 
 Это здесь ни при чём. Посылатель (клиент) работает корректно.
 
 >Вот. Может кто знает как тут можно выкрутится. Уж очень не хочется сдаваться и
 >читать на стороне клиенте файл в массив а потом слать send()ом.
 
 Дык, заверни на сервере read(2) в цикл и читай до тех пор, пока не вернёт 0 
 либо ошибку.
 
 Вал. Дав.
 
 --- ifmail v.2.15dev5.3
  * Origin: Demos online service (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/657708c8e5d4.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional