-
Calligraff © (10.12.08 10:53) [0]Добрый день.
Подскажите пожалуйста как можно реализовать следующее:
Есть тип:
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 принять??
Зарание благодарен -
Медвежонок Пятачок © (10.12.08 11:46) [1]TClientsData = record
UIN: Integer;
Password: shortstring;
end;
var cd : TClientsData;
.....
soket.WriteBuff(cd,SizeOf(TClientsData)); -
Спасибо, Медвежонок Пятачок :)
Не подскажешь еще одно.
Вот на серверной стороне программы делаю так
procedure TformMain.socketServerClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
var
Data: TClientsData;
begin
ClientSocket1.Active := True;
Data := TClientsData.Create;
Socket.ReceiveBuf(Data,Socket.ReceiveLength);
end;
но в итоге Data.UIN = 0, а Data.Password Пустой -
Медвежонок Пятачок © (10.12.08 12:33) [3]Data := TClientsData.Create;
А должен быть тот же тип что и при отправке. -
> А должен быть тот же тип что и при отправке.
Точно. Спасибо огромное :) -
Сергей М. © (10.12.08 13:04) [5]
> Calligraff
Все равно работать не будет -
ВСе. заработало!
только теперь другая проблема
Есть тип:
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.
Как исправить и как быть со строками большой длины?
Зарание благодарен. -
Сергей М. © (10.12.08 14:17) [7]
> как быть со строками большой длины?
их нужно отправлять принимать отдельно, а не в составе структуры -
Может как-то переводить переменную в Pointer и посылать? Но тогда я тем более не имею представления как
-
Сергей М. © (10.12.08 14:37) [9]см. SendText, ReceiveText
-
SendText, ReceiveText - не вариант, так как с текстом необходимо передавать данныеFUIN: Integer;
TUIN: Integer;
TypeData: Shortint; -
Сергей М. © (10.12.08 16:00) [11]
> Calligraff © (10.12.08 15:09) [10]
Раз ты озаботился передачей-приемом дин.типов данных с управляемым временем жизни, таких как AnsiString, затею с передачей структуры "одним махом" выбрось из головы.
Для для передачи/приема данных типа AnsiString используй Send/ReceiveText
Для для передачи/приема иных данных используй SendStream, Send/ReseiveBuf. -
Ясно.
Прям неудобно, но у меня еще возник вопрос
Как задать подключению определенный ID, например такой же как и UIN пользователя для того чтобы можно было быстро отправлят сообщение от одного пользователя к тому, которому адресованно сообщение не ища в искусственно созданой таблице активных пользователей адресата. -
Или может есть другие варианты?
-
Сергей М. © (10.12.08 16:20) [14]"не ища" не получится.
> в искусственно созданой таблице
Не надо создавать никакие "искуственные таблицы".
Список активных клиентов сервера доступен в ServerSocket.Socket.Connections.
У каждого эл-та списка - объекта TServerClientWinSocket - есть св-во Data, которое предназначено для хранения любой индивидуальной клиентской инф-ции. -
Угумс...
Тогда как в Socket.Data (кот. имеет тип Pointer) запихнуть целое (типа Integer) число??? -
clickmaker © (10.12.08 17:52) [16]> как в Socket.Data (кот. имеет тип Pointer) запихнуть целое
szieof(pointer) >= sizeof(integer) -
Не понял немного.. поподробнее можно.. Дело в том, что с типом Pointer не работал
Зарание благодарен -
Понял как!
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;
-
clickmaker © (10.12.08 18:14) [19]можно и без класса-обертки
pointer = integer в 32 битных ОС и int64 в 64-битных