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

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

Склеивание пакетов, избежание при этом ошибок [D6, WinXP]


Delpher_Gray ©   (2004-03-04 20:09:00) 

Такая проблема...
В программе есть два режима работы: приём префикса, и приём данных.
Профикс указывает на то, что нужно сделать с данными когда они будут приняты.
Если префикс и данные приходят в разных пакетах, то всё работает. А если пакеты склеиваются, то всё обламывается :(
Вот код приёма данных:

        if PrefixReceive then
       begin
         Stream.Size := 0; // Очищаем буфер

         BytesRead := recv(WParam, Buf, SizeOf(Buf) - PrefixOffset, 0); // Получаем размер данных
         Inc(PrefixOffset, BytesRead);

         if PrefixOffset = SizeOf(Prefix) then
         begin
           Prefix.FuncCode := PPrefix(@Buf)^.FuncCode;
           Prefix.DataSize := PPrefix(@Buf)^.DataSize;

           // Тут выполняются функции, в которых не нужны дополнительные данные

           if Prefix.DataSize > 0 then // Приём данных
             PrefixReceive := false
           else // Приём префикса
             PrefixOffset := 0;
         end;
       end else
       begin
         BytesRead := recv(WParam, Buf, Min(Prefix.DataSize, SizeOf(Buf)), 0);
         Stream.Write(Buf, BytesRead);

         Dec(Prefix.DataSize, BytesRead);
         if Prefix.DataSize = 0 then
         begin
           // Тут выполняются функции, в которых НУЖНЫ дополнительные данные

           PrefixReceive := true;
           PrefixOffset := 0;
         end;
       end;


Доп. инфо:

Stream - буфер для приёма информации (array[1..1024] of Char)
PrefexReceive - режим сервера (boolean)

Prefix:
type
 TPrefix = packed record
   FuncCode: integer;
   DataSize: integer;
 end;
 PPrefix = ^TPrefix;

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

Заранее благодарен !


Verg   (2004-03-05 12:09:00) [1]

1. Вставь проверки -  BytesRead д.б. > 0
2. BytesRead := recv(WParam, Buf [PrefixOffset+1], SizeOf(Prefix) - PrefixOffset, 0); // Получаем размер данных


Verg   (2004-03-05 11:53:00) [2]

А, по-моему, с учетом

> Delpher_Gray ©   (04.03.04 20:50) [1]


все должно быть в порядке.


Rouse_   (2004-03-05 11:42:00) [3]

Ты бы лучше принял все полностью, а там уже смотрел что и куда...


Delpher_Gray   (2004-03-05 11:08:00) [4]

>Так они от этого никуда не делись. При следующем чтении остаток обязан прочитаться.
Ну так остаток то причитается уже в режиме приёма данных... Илил нет !? %|


Alex Konshin   (2004-03-05 03:19:00) [5]

Так они от этого никуда не делись. При следующем чтении остаток обязан прочитаться.


Delpher_Gray   (2004-03-04 20:50:00) [6]

Что-то я сегодня туплю страшно...
Вгляделся в код, и вот оно... BytesRead := recv(WParam, Buf, SizeOf( Prefix) - PrefixOffset, 0);
Читаю то я префик а не все данные..... Вот они и обрезались ;)


Наверх

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