Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.011 c
1-73680
Андрусь
2002-09-10 20:15
2002.09.23
как добавить в Object Inspector/Color своих цветов


14-73871
Shrek
2002-08-28 17:41
2002.09.23
SoftIce


14-73879
Wonder
2002-08-29 16:26
2002.09.23
:)))


3-73517
KO/lO6OK
2002-09-02 12:12
2002.09.23
Работа с BLOB-полями Interbase через SQL


1-73700
Чужой, но не свой
2002-09-08 23:42
2002.09.23
Прогресс.