Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Склеивание пакетов, избежание при этом ошибок   Найти похожие ветки 

 
Delpher_Gray ©   (2004-03-04 20:09) [0]

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

       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;

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

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


 
Delpher_Gray ©   (2004-03-04 20:50) [1]

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


 
Alex Konshin ©   (2004-03-05 03:19) [2]

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


 
Delpher_Gray ©   (2004-03-05 11:08) [3]

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


 
Rouse_ ©   (2004-03-05 11:42) [4]

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


 
Verg ©   (2004-03-05 11:53) [5]

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

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


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


 
Verg ©   (2004-03-05 12:09) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
3-1080906055
Дмитрий
2004-04-02 15:40
2004.05.02
CONNECT TO FIREBIRD через Инет!!! Хелп!


14-1081798589
Мишка Кулясов
2004-04-12 23:36
2004.05.02
Лишают ника


1-1081937411
FireMan_Alexey
2004-04-14 14:10
2004.05.02
Как можно расчитать смещение от начала файла до записи константы


4-1078338089
deema
2004-03-03 21:21
2004.05.02
Как отменить прорисовку child windows-ов?


14-1081451676
Yanis
2004-04-08 23:14
2004.05.02
Хумор