Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.03 c
8-1075539418
Millennium
2004-01-31 11:56
2004.05.02
скриншот


14-1081360469
Verg
2004-04-07 21:54
2004.05.02
Про CVS


14-1081678222
Ломброзо
2004-04-11 14:10
2004.05.02
Диалоги запросов


14-1081374394
Феликс
2004-04-08 01:46
2004.05.02
Анимация для игр


4-1078669492
DoG
2004-03-07 17:24
2004.05.02
Виртуальная КЛАВА !!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский