Форум: "Сети";
Текущий архив: 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