Главная страница
    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.036 c
3-1081162922
}|{yk
2004-04-05 15:02
2004.05.02
Group by для union


3-1080761597
wizzo
2004-03-31 23:33
2004.05.02
Как сделать сортировку в Table или DataSorce?


9-1069178795
defeq
2003-11-18 21:06
2004.05.02
Проблемы с поверхностью, которая больше экрана


14-1081426797
lepton77
2004-04-08 16:19
2004.05.02
А где новые дайджесты форумов?


7-1078581566
InfoCar1
2004-03-06 16:59
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский