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

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

Передача типов через TClientsData [D6, Win2k, WinXP]


Страницы:   1 2 3

Calligraff ©   (2008-12-10 10:53:00) 

Добрый день.

Подскажите пожалуйста как можно реализовать следующее:

Есть тип:

type
 TClientsData = class(TObject)
   UIN: Integer;
   Password: String;
 end;

var
  Data: TClientsData;
begin
Data := TClientsData.Create;
Data.Login := 450355355;
Data.Password := '';

// TClientSocket
// Как отправить?

end;

Как отправить Data через TClientSocket, а на TServerSocket принять??

Зарание благодарен


Сергей М.   (2008-12-10 19:48:00) [21]


> как указать, что данный текст посылается определенному пользователю
> в сети?


Перед посылкой текста посылай инф-цию о том кому он адресован.


Calligraff   (2008-12-10 18:56:00) [22]


> Для для передачи/приема данных типа AnsiString используй
> Send/ReceiveText


Тогда как указать, что данный текст посылается определенному пользователю в сети??


Calligraff   (2008-12-10 18:48:00) [23]

Спасибо огромное :)


Calligraff   (2008-12-10 18:29:00) [24]

ясно


clickmaker   (2008-12-10 18:14:00) [25]

можно и без класса-обертки
pointer = integer в 32 битных ОС и int64 в 64-битных


Calligraff   (2008-12-10 18:01:00) [26]

Понял как!

type
 TUIN = class(TObject)
   UIN: Integer;
 end;

........

procedure TformMain.socketServerClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
  Clnt: TUIN;
  Clnt1: TUIN;
begin
Clnt := TUIN.Create;
Clnt.UIN := 250355355;
Socket.Data := Clnt;
Clnt1 := TUIN.Create;
Clnt1 := Socket.Data;
Memo1.Lines.Add(IntToStr(Clnt1.UIN));
end;


Calligraff   (2008-12-10 17:53:00) [27]

Не понял немного.. поподробнее можно.. Дело в том, что с типом Pointer не работал

Зарание благодарен


clickmaker   (2008-12-10 17:52:00) [28]

> как в Socket.Data (кот. имеет тип Pointer) запихнуть целое

szieof(pointer) >= sizeof(integer)


Calligraff   (2008-12-10 17:39:00) [29]

Угумс...

Тогда как в Socket.Data (кот. имеет тип Pointer) запихнуть целое (типа Integer) число???


Сергей М.   (2008-12-10 16:20:00) [30]

"не ища" не получится.


> в искусственно созданой таблице


Не надо создавать никакие "искуственные таблицы".

Список активных клиентов сервера доступен в ServerSocket.Socket.Connections.
У каждого эл-та списка - объекта TServerClientWinSocket - есть св-во Data, которое предназначено для хранения любой индивидуальной клиентской инф-ции.


Calligraff   (2008-12-10 16:08:00) [31]

Ясно.

Прям неудобно, но у меня еще возник вопрос

Как задать подключению определенный ID, например такой же как и UIN пользователя для того чтобы можно было быстро отправлят сообщение от одного пользователя к тому, которому адресованно сообщение не ища в искусственно созданой таблице активных пользователей адресата.


Calligraff   (2008-12-10 16:08:00) [32]

Или может есть другие варианты?


Сергей М.   (2008-12-10 16:00:00) [33]


> Calligraff ©   (10.12.08 15:09) [10]


Раз ты озаботился передачей-приемом дин.типов данных с управляемым временем жизни, таких как AnsiString, затею с передачей структуры "одним махом" выбрось из головы.

Для для передачи/приема данных типа AnsiString используй Send/ReceiveText
Для для передачи/приема иных данных используй SendStream, Send/ReseiveBuf.


Calligraff   (2008-12-10 15:09:00) [34]

SendText, ReceiveText - не вариант, так как с текстом необходимо передавать данные
  FUIN: Integer;
  TUIN: Integer;
  TypeData: Shortint;


Сергей М.   (2008-12-10 14:37:00) [35]

см. SendText, ReceiveText


Calligraff   (2008-12-10 14:21:00) [36]

Может как-то переводить переменную в Pointer и посылать? Но тогда я тем более не имею представления как


Сергей М.   (2008-12-10 14:17:00) [37]


> как быть со строками большой длины?


их нужно отправлять принимать отдельно, а не в составе структуры


Calligraff   (2008-12-10 14:03:00) [38]

ВСе. заработало!

только теперь другая проблема

Есть тип:

type
 RClientLoginInfo = record
   FUIN: Integer;
   TUIN: Integer;
   TypeData: Shortint;
   Data: String[254];
 end;


Все отлично работает, НО. необходимо передать строку длиной более 255 символов. поэтому заменяю Data: String[254];на Data: String;

В следствии чего при посылке данных от клиента к серверу
procedure SendRegInfo();
var
  Data: RClientLoginInfo;
begin
Data.FUIN := 1111111;
Data.TUIN := 2222222;
Data.TypeData := 0;
Data.Data := '<текст длиной более 255 символов>';

formMain.ClientSocket1.Socket.SendBuf(Data,SizeOf(RClientLoginInfo));
end;


и получение сервером данных

procedure TformMain.socketServerClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
  Data: RClientLoginInfo;
begin
Socket.ReceiveBuf(Data,Socket.ReceiveLength);
Memo1.Lines.Add(Data.Data);
end;


на моменте строки Memo1.Lines.Add(Data.Data);возникает ошибка Out of Memory.

Как исправить и как быть со строками большой длины?

Зарание благодарен.


Сергей М.   (2008-12-10 13:04:00) [39]


> Calligraff


Все равно работать не будет


Calligraff   (2008-12-10 12:39:00) [40]


> А должен быть тот же тип что и при отправке.

Точно. Спасибо  огромное :)


Страницы:   1 2 3

Наверх

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