Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ReceiveLength [D7, WinXP]


VeryVeryLongInteger ©   (2007-08-01 12:03:00) 

Возьмем к примеру TCustomWinSocket. Не понимаю зачем нужно ReceiveLength, т.е. что это такое, ведь как я понимаю достоверно нельзя понять сколько пришло данных пока не сделаешь fact := Socket.ReceiveBuf(... где fact - фактическое принятое количество данных.

Вопрос такой, что это такое ReceiveLength, зачем оно нужно и что оно может содержать и где используется.

Спасибо.


Сергей М.   (2007-08-01 13:03:00) [1]


> Этот размер будет всегда больше (или равен) фактических
> > значений?
>
>


При условии что последующий recv в идеале будет вызван мгновенно сразу после ioctlsocket


Сергей М.   (2007-08-01 12:53:00) [2]


> Этот размер будет всегда больше (или равен) фактических
> значений?


Да, в соответствии с док-цией к WSA это именно так.


Сергей М.   (2007-08-01 12:52:00) [3]


> А каким тогда образом он определяет размер заведомо принятых
> данных?


А никаким.

"Заведомо принятые данные" - это queued-данные. т.е. те данные, которые возвращает Receive-методы объекта

Ф-ция ioctlsocket, вызванная с параметром FIONREAD, не оперирует queued-данными в силу особенностей реализации WSP.

Т.е. поведение ioctlsocket провайдер-зависимо.

Подтверждение тому находим в справке к WSAIoctl (FIONREAD):

If s is stream oriented (for example, type SOCK_STREAM), FIONREAD returns the total amount of data which may be read in a single receive operation; this is normallythe same as the total amount of data queued on the socket


Заметь - normally, А не always. По-русски это следует расценивать как "обычно это так, но вовсе не обязательно что это будет именно так не иначе".

Ну а раз "обычно", то и полагаться на то, что ReceiveBuf(ReceiveLength) вернет в точности "заказанный" объем данных, нет никаких оснований.


VeryVeryLongInteger   (2007-08-01 12:27:00) [4]

А каким тогда образом он определяет размер заведомо принятых данных? Этот размер будет всегда больше (или равен) фактических значений?


Сергей М.   (2007-08-01 12:14:00) [5]


> Не понимаю зачем нужно ReceiveLength


И правильно не понимаешь)

В подавляющем большинстве алгоритмических решений этот метод нафих не нужен к применению.


> зачем оно нужно


Как правило, чтобы распределить буферную память заведомо достаточного размера.


> где используется


Вызов своего метода ReceiveLength объект TCustomWinSocket нигде не осуществляет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо