Главная страница
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.012 c
1-73600
still
2002-09-12 10:35
2002.09.23
HTML Help Workshop


1-73625
#Deus
2002-09-11 20:33
2002.09.23
Delphi 7


1-73723
Alex Che
2002-09-11 12:12
2002.09.23
Быстрое преобразование Фурье


1-73663
AL2002
2002-09-12 21:17
2002.09.23
Как удостовериться, что шрифт не установлен,


1-73741
Mars
2002-09-11 15:46
2002.09.23
Как добавить компоненту новое событие?