Передача структуры по сети.

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем mibin, 13 дек 2010.

  1. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Привет, есть необходимость передать структуру по сети.
    Так вот для этого я пытался использовать компоненты TcpClient и TcpServer у них есть метод SendBuf но я все время получаю -1...то есть как я понимаю пустой буфер приходит...подскажите пожалуйста как передать структуру и еще так же я пытался пользоваться Indy компонентами (аналоги этих же), но там как я понимаю нужно переводить структуру в TByteDynArray или в TStream очень благодарен если вы мне подскажите как это сделать (перевод туда и обратно имею ввиду). Заранее спасибо.
     
  2. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Ну что? Неужели никто не знает как с помощью INDY 11 компонентов послать структуру? Ну е мое?
     
  3. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Вот как это делается для случая со статическими структурами, как мне подсказали на другом форуме для работы с динамическими нужно еще передать размер струтуры (см. код листинг 2)
    Код (C++):
    struct _tAirplane {
    int priority;
    int fuel;
    char name[10];
    int emergency;
    int passengers;
    };
    // при отправке делаем следующее

    _tAirplane airplane;
    TByteDynArray buf;
    buf.Length = 0;
    buf = RawToBytes(&airplane, sizeof(airplane));
    Form1->IdTCPClient1->IOHandler->Write(buf);

    // а вот прием

    _tAirplane airplane;
    TByteDynArray buf;

    buf.Length = 0;

    AContext->Connection->IOHandler->ReadBytes(buf, sizeof(airplane), false);
    BytesToRaw(buf, &airplane, sizeof(airplane));
    Код (C++):
    // Передача
    TCPClient->Socket->WriteLn(IntToStr(PartSend->SendBuf->Size));
    TCPClient->Socket->Write(PartSend->SendBuf);
    //Прием
    __int64 Size = StrToInt64(AContext->Connection->Socket->ReadLn());
    AContext->Connection->Socket->ReadStream(CurrentPeer->SendBuf,Size,false);
     
Загрузка...

Поделиться этой страницей