![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Склеивание пакетов, избежание при этом ошибок [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);
Читаю то я префик а не все данные..... Вот они и обрезались ;)