Главная страница
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.015 c
1-73670
Viktor Kushnir
2002-09-08 13:08
2002.09.23
Drag блин and Drop


1-73719
tytus
2002-09-11 11:34
2002.09.23
Please help!!!


7-73910
Fredericco
2002-07-12 15:03
2002.09.23
Shell=MyProg.exe


1-73643
grigorys
2002-09-12 17:09
2002.09.23
VB И DELPHI


3-73552
dihlos
2002-09-03 13:06
2002.09.23
Подскажите как?