Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Norrius |
24.7.2012, 16:51
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: 0
|
Добрый день. Я пишу небольшой проект, содержащийсервер
Добрый день. Я пишу небольшой проект, содержащий серверную и клиентскую часть. В частности, мне нужно, чтобы клиент имел копию некоторого класса, имеющегося на сервере. Собственно, вопрос - как передать объект класса через TCP сокет? Нужно ли мне вручную создавать QByteArray, содержащий закодированную информацию об объекте (а он может содержать другие классы и структуры), или есть более простые способы? |
|
|
|
|
ViGOur |
24.7.2012, 18:58
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
В Qt connection points нет насколько я знаю.
Нужно только руками. Для примера два способа: 1 способ и самый простой - это использование стандартных С++ типов, вроде int, char и ... Ничего тебе не мешает имея такую структуру: отправить её: 2 способ - реализация реализация своего operator char*() для класса, для последуюшей отправки по сети. |
|
|
|
|
Алексей1153 |
24.7.2012, 19:41
Сообщение
#3
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
сериализация в XML - универсальное в данном случае средство
(со структурами тоже можно, но всё это будет удобно ровно до первого изменения структур. Опять же, динамически выделенную память передавать без трудностей так невыйдет) |
|
|
|
|
Norrius |
24.7.2012, 23:16
Сообщение
#4
|
|
Студент ![]() Группа: Участник Сообщений: 26 Регистрация: 30.12.2011 Пользователь №: 3105 Спасибо сказали: 0 раз(а) Репутация: 0
|
Использовать memcpy() у меня не получается (хотя, может, я просто не понял документацию), я получаю мусор в клиенте. Сервер:
Где QList<QTcpSocket *> connections содержит все подключения. Клиент: Цитата(ViGOur @ 24.7.2012, 19:58) Link реализация своего operator char*() А что это есть и где про это можно узнать подробнее? Цитата(Алексей1153 @ 24.7.2012, 20:41) Link сериализация в XML - универсальное в данном случае средство Не будет ли это заворотом в лишнюю обертку? |
|
|
|
|
ViGOur |
25.7.2012, 8:46
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
сервер
клиент Цитата(Norrius @ 25.7.2012, 0:16) Link А что это есть и где про это можно узнать подробнее? В принципе любой из книжек по С++.Смотри в сторону переопределения операторов, там объясняется как переопределять operator int, operator char и т.д. и т.п. Например можешь почитать: C++ : библиотека программиста (Автор: Джефф Элджер) У него точно есть подробное описание этого оператора, на примере класса String... |
|
|
|
|
Iron Bug |
25.7.2012, 12:42
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
процедура передачи класса - даже не сериализация, а маршалинг. если интересует эта тема - читать про маршалинг (marshaling) в С++.
|
|
|
|
|
Алексей1153 |
25.7.2012, 22:44
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Norrius @ 25.7.2012, 2:16) Link е будет ли это заворотом в лишнюю обертку? Мне нужно просто синхронизировать данные о классе p. я не предлагаю обёртку, я предлагаю гибкий способ передачи |
|
|
|
|
ssoft |
26.7.2012, 6:52
Сообщение
#8
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3
|
Цитата(ViGOur @ 25.7.2012, 9:46) Link сервер memcpy(buff, &tmp, sizeof(p)); Language: cpp клиент memcpy(&tmp, buff, sizeof(p)); Это работает, если класс содержит только простые типы. Если класс содержит аля QByteArray, QString или любой указатель, то только сериализация или маршалинг. Цитата(Norrius @ 25.7.2012, 0:16) Link Не будет ли это заворотом в лишнюю обертку? Мне нужно просто синхронизировать данные о классе p. В общем случае проще ничего не придумали. Сообщение отредактировал ssoft - 26.7.2012, 6:52 |
|
|
|
|
ViGOur |
26.7.2012, 8:24
Сообщение
#9
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40
|
Цитата(ssoft @ 26.7.2012, 7:52) Link Это работает, если класс содержит только простые типы. Цитата(ViGOur @ 24.7.2012, 19:58) Link это использование стандартных С++ типов, вроде int, char и ... |
|
|
|
|
Алексей1153 |
26.7.2012, 10:41
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(ssoft @ 26.7.2012, 9:52) Link Если класс содержит аля QByteArray, QString или любой указатель, или хотя бы одну виртуальную функцию |
|
|
|
![]() ![]() |
|
Текстовая версия | Сейчас: 23.12.2025, 4:40 |