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


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)
 
 

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

 Тема:    Автор:    Дата:  
 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/3929456235c1.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional