|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Andrey Ushakov 2:5020/400 20 Nov 2006 00:41:24 To : All Subject : sendfile system call in FreeBSD -------------------------------------------------------------------------------- Вроде подразобрался, и увидел проблему с использованием 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() она возвращает управление до того как будет послан весь файл. Соответственно в клиенте имеем -1 и errno = 32 =\ В FTPD.C есть такая штука упомянутом выше while if (err == -1){ if (!cnt) goto oldway; goto data_err; } ... oldway: ... while ((cnt = read(filefd, buf, (u_int)blksize)) > 0 && write(netfd, buf, cnt) == cnt) ... У меня это не прокатило. recv() вылетел ничего не считав =\ Вот. Может кто знает как тут можно выкрутится. Уж очень не хочется сдаваться и читать на стороне клиенте файл в массив а потом слать send()ом. Айм стак =( cmp: всё познаётся в сравнении --- ifmail v.2.15dev5.3 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/166791d92809d.html, оценка из 5, голосов 10
|