Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ReceiveText или ReceiveBuf? [D5, Win95/98]


Valentain ©   (2002-07-22 12:04:00) 

Как определить, что пришло от опонента - строка или буфер, а если буфер, то какова его структура... Какие структуры могут прийти отправляющий и принимающий знает...
Один из вариантов (который, по моему, возможен):
- шлется строка, в которой указывается (кодово) вид пересылаемой структуры; {?ReceiveText или ReceiveBuf?}
второй:
- кодовая комбинация содержится в передаваемом буфере, типа:

Type
Dr1 = Record
Coder: String[6];
Data1: Rec1;
end;

Dr2 = Record
Coder: String[6];
Data2: Rec1;
end;

{?Как отличить Dr1 от Dr2, если Data1 и Data2 отличаются?}...


Digitman   (2002-07-22 13:20:00) [1]

>Wonder

А шо делать ?)

Грабли-то - откровенные, а по лбу лупят здорово))))))
Знаешь, сколько народу с шишками ходит ?)

>Valentain
Есть прекрасная иллюстрация , как грамотно это делать.
Иллюстрация эта - в демо-проекте scktsrvr.dpr.


Valentain   (2002-07-22 13:10:00) [2]

... я когда-то что-то пропустил...
Вроде переменная явно не определена,
или если обозначить D: Dr2;, а пришло Dr6...
А рисовать структуру пакета эдакую:

Dr1 = Record
Coder: String[6];
Data1: Rec1;
Data2: Rec2;
Data3: Rec3;
...
Datan: Recn;
end;

когда используется только одна запись (Data), как-то не хочется, или я чего-то не понимаю...


Wonder   (2002-07-22 13:06:00) [3]

>Digitman
Практичен как всегда :)))))))


Digitman   (2002-07-22 13:03:00) [4]

Нонсенс здесь в другом. Нельзя использовать ReceiveLength() в таком контексте. ReceiveLength() - ожидаемый размер данных, а не реально доступный в момент FD_READ-события. И нужен этот самый ReceiveLength() лишь для резервирования ПОТЕНЦИАЛЬНО НЕОБХОДИМОГО объема памяти, а не достаточного.
Фактический размер доступного в событии FD_READ блока становится известным лишь в результате вызова ReceiveBuf(), и этот размер всегда меньше или равен величине , возвращаемой методом ReceiveLength()


Wonder   (2002-07-22 12:50:00) [5]

Считай, что ты изобретаешь новый протокол. Пакет этого протокола - некая, тобой определенная структура с нужным кол-вом полей. Большинство протоколов используют поля с кодом, определяющим тип пакета. У тебя та же логика.
В чем нонсенс-то?


Valentain   (2002-07-22 12:43:00) [6]

Согласен, 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:30:00) [7]

:)))
Перечитал сам себя. Не то имел ввиду.

Унифицировать пересылаемые структуры и использовать совет Digitman-а.


Digitman   (2002-07-22 12:27:00) [8]

Рекомендую вообще отказаться от Send/ReceiveText(). Ф-ции буферного транспорта более гибкие.


Wonder   (2002-07-22 12:20:00) [9]

IMHO, проще и правильнее унифицировать оба варианта...


Наверх

Титульная страница Поиск, карта сайта Написать письмо