![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача типов через TClientsData [D6, Win2k, WinXP]
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]
> А должен быть тот же тип что и при отправке.
Точно. Спасибо огромное :)