Главная страница
    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.077 c
3-1081070306
Rakhim
2004-04-04 13:18
2004.05.02
Редактирование в таблице


14-1081475220
niko4543
2004-04-09 05:47
2004.05.02
Компонент. Поиогите!!!!! пожайлуста Срочно!!!!!!!!!!!!!!!!!!!!!!!


11-1066723048
Ал
2003-10-21 11:57
2004.05.02
Еще раз про "приклеивание" окна к рабочему столу


1-1081862767
Dentist
2004-04-13 17:26
2004.05.02
Разворачивание окна


1-1081865524
madm
2004-04-13 18:12
2004.05.02
Как быстро загружать текст с атрибутами в RichEdit





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