Конференция "Сети" » Передача типов через TClientsData [D6, Win2k, WinXP]
 
  • 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));
  • Calligraff © (10.12.08 12:21) [2]
    Спасибо, Медвежонок Пятачок :)

    Не подскажешь еще одно.

    Вот на серверной стороне программы делаю так


    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;

    А должен быть тот же тип что и при отправке.
  • Calligraff © (10.12.08 12:39) [4]

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

    Точно. Спасибо  огромное :)
  • Сергей М. © (10.12.08 13:04) [5]

    > Calligraff


    Все равно работать не будет
  • Calligraff © (10.12.08 14:03) [6]
    ВСе. заработало!

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

    Есть тип:

    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]

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


    их нужно отправлять принимать отдельно, а не в составе структуры
  • Calligraff © (10.12.08 14:21) [8]
    Может как-то переводить переменную в Pointer и посылать? Но тогда я тем более не имею представления как
  • Сергей М. © (10.12.08 14:37) [9]
    см. SendText, ReceiveText
  • Calligraff © (10.12.08 15:09) [10]
    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.
  • Calligraff © (10.12.08 16:08) [12]
    Ясно.

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

    Как задать подключению определенный ID, например такой же как и UIN пользователя для того чтобы можно было быстро отправлят сообщение от одного пользователя к тому, которому адресованно сообщение не ища в искусственно созданой таблице активных пользователей адресата.
  • Calligraff © (10.12.08 16:08) [13]
    Или может есть другие варианты?
  • Сергей М. © (10.12.08 16:20) [14]
    "не ища" не получится.


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


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

    Список активных клиентов сервера доступен в ServerSocket.Socket.Connections.
    У каждого эл-та списка - объекта TServerClientWinSocket - есть св-во Data, которое предназначено для хранения любой индивидуальной клиентской инф-ции.
  • Calligraff © (10.12.08 17:39) [15]
    Угумс...

    Тогда как в Socket.Data (кот. имеет тип Pointer) запихнуть целое (типа Integer) число???
  • clickmaker © (10.12.08 17:52) [16]
    > как в Socket.Data (кот. имеет тип Pointer) запихнуть целое

    szieof(pointer) >= sizeof(integer)
  • Calligraff © (10.12.08 17:53) [17]
    Не понял немного.. поподробнее можно.. Дело в том, что с типом Pointer не работал

    Зарание благодарен
  • Calligraff © (10.12.08 18:01) [18]
    Понял как!

    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-битных
 
Конференция "Сети" » Передача типов через TClientsData [D6, Win2k, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]