|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Alex Semenyaka 2:461/640.640 20 Nov 2006 19:47:56 To : Andrey Ushakov Subject : sendfile system call in FreeBSD -------------------------------------------------------------------------------- 20 Nov 06 16:44, you wrote to Valentin Davydov: VD>> Дык, заверни на сервере read(2) в цикл и читай до тех пор, пока не VD>> вернёт 0 либо ошибку. AU> Hе получается так сделать. Дело в том что на этом диалог не завершается AU> У меня дальше ещё вот: AU> if((rc = recv(s, buf, sizeof(buf), MSG_WAITALL)) < 0) AU> { AU> printf("stcpcl: delivererd failed"); AU> exit(1); AU> } AU> Я жду уведомления о доставке. AU> Я пробовал после того как отправлю файл послать ещё маленькое сообщение AU> серверу типа: AU> if((rc = send(s, "endf", 4, 0)) < 0) AU> Почему-то воспринимает и данные передаваемого файла и последующего AU> маленького сообщения как один и тот же поток. По моему это непрвильно. Да, не выиграть тебе конкурс. Ты явно не представляешь себе, как происходит передача данных по TCP. Крайне рекомендую срочно почитать чего-нибудь по TCP. AU> Либо это sendfile такой странный, либо я чё-то не понимаю =\ Это ты довольно многого не понимаешь. Если коротко, то: Поток TCP представляет собой неструктурированный поток байтов. В нём нет отметок о границах записей, файлов или ещё каких-то единиц, существующих на уровне твоей ОС. Ты можешь делать эти отметки, но их надо ставить тебе самому, стандартный API такой возможности не предоставляет, ибо нефиг. Другими словами, три записи в поток могут породить 1, 2 или 3 пакета, и на другой стороне могут быть прочитаны как одним, двумя, тремя или восмьюста операциями чтения. У пользователя нет способа в стандартном API понять, сколько операций записи проводилось. Аналогично, sendfile(2) не формирует никаких отметок о том, что он посылает файл как объект. Он тупо берёт и шлёт байты из указанного файла потоком. Всё, что ты пошлёшь вслед, ляжет в тот же поток. Способа у получателя отличить посланное с помощью sendfile(2) от дописанного любым способом позже нет. Если он тебе нужен - ты должен реализовывать свой собственный механизм для этого. Alex --- IMHO в последней инстанции * Origin: ...можжевеловых... (2:461/640.640) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/3929456235c1.html, оценка из 5, голосов 10
|