|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/657708c8e5d4.html, оценка из 5, голосов 10
|