Текущий архив: 2002.09.23;
Скачать: CL | DM;
Вниз
ReceiveText или ReceiveBuf? Найти похожие ветки
← →
Valentain © (2002-07-22 12:04) [0]Как определить, что пришло от опонента - строка или буфер, а если буфер, то какова его структура... Какие структуры могут прийти отправляющий и принимающий знает...
Один из вариантов (который, по моему, возможен):
- шлется строка, в которой указывается (кодово) вид пересылаемой структуры; {?ReceiveText или ReceiveBuf?}
второй:
- кодовая комбинация содержится в передаваемом буфере, типа:
Type
Dr1 = Record
Coder: String[6];
Data1: Rec1;
end;
Dr2 = Record
Coder: String[6];
Data2: Rec1;
end;
{?Как отличить Dr1 от Dr2, если Data1 и Data2 отличаются?}...
← →
Wonder © (2002-07-22 12:20) [1]IMHO, проще и правильнее унифицировать оба варианта...
← →
Digitman © (2002-07-22 12:27) [2]Рекомендую вообще отказаться от Send/ReceiveText(). Ф-ции буферного транспорта более гибкие.
← →
Wonder © (2002-07-22 12:30) [3]:)))
Перечитал сам себя. Не то имел ввиду.
Унифицировать пересылаемые структуры и использовать совет Digitman-а.
← →
Valentain © (2002-07-22 12:43) [4]Согласен, ReceiveText не использую, остается только определиться с Dr1 и Dr2...
загвоздка заключается в следующем:
...
var D: Dr1 {?или Dr2?или Drn?}
...
Socket.ReceiveBuf(D, Socket.ReceiveLength);
if D.Coder = Cod1 then // тип №1
if D.Coder = Cod2 then // тип №2
...
if D.Coder = Codn then // тип №n
... нонсенс вроде...
← →
Wonder © (2002-07-22 12:50) [5]Считай, что ты изобретаешь новый протокол. Пакет этого протокола - некая, тобой определенная структура с нужным кол-вом полей. Большинство протоколов используют поля с кодом, определяющим тип пакета. У тебя та же логика.
В чем нонсенс-то?
← →
Digitman © (2002-07-22 13:03) [6]Нонсенс здесь в другом. Нельзя использовать ReceiveLength() в таком контексте. ReceiveLength() - ожидаемый размер данных, а не реально доступный в момент FD_READ-события. И нужен этот самый ReceiveLength() лишь для резервирования ПОТЕНЦИАЛЬНО НЕОБХОДИМОГО объема памяти, а не достаточного.
Фактический размер доступного в событии FD_READ блока становится известным лишь в результате вызова ReceiveBuf(), и этот размер всегда меньше или равен величине , возвращаемой методом ReceiveLength()
← →
Wonder © (2002-07-22 13:06) [7]>Digitman
Практичен как всегда :)))))))
← →
Valentain © (2002-07-22 13:10) [8]... я когда-то что-то пропустил...
Вроде переменная явно не определена,
или если обозначитьD: Dr2;
, а пришло Dr6...
А рисовать структуру пакета эдакую:
Dr1 = Record
Coder: String[6];
Data1: Rec1;
Data2: Rec2;
Data3: Rec3;
...
Datan: Recn;
end;
когда используется только одна запись (Data), как-то не хочется, или я чего-то не понимаю...
← →
Digitman © (2002-07-22 13:20) [9]>Wonder
А шо делать ?)
Грабли-то - откровенные, а по лбу лупят здорово))))))
Знаешь, сколько народу с шишками ходит ?)
>Valentain
Есть прекрасная иллюстрация , как грамотно это делать.
Иллюстрация эта - в демо-проекте scktsrvr.dpr.
Страницы: 1 вся ветка
Текущий архив: 2002.09.23;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.012 c