crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
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 и ...
Ничего тебе не мешает имея такую структуру:
struct sClass
{
  int n;
  double d;
  char s[1024];
};

отправить её:
sClass sc;
char *pBuff = new char[sizeof(sClass)];
// заполняем sc
memcpy( sc, pBuff, sizeof( sClass));
send( sock, pBuff, sizeof(sClass), 0 );


2 способ - реализация реализация своего operator char*() для класса, для последуюшей отправки по сети.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.7.2012, 19:41
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


сериализация в XML - универсальное в данном случае средство :)

(со структурами тоже можно, но всё это будет удобно ровно до первого изменения структур. Опять же, динамически выделенную память передавать без трудностей так невыйдет)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Norrius
  опции профиля:
сообщение 24.7.2012, 23:16
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 30.12.2011
Пользователь №: 3105

Спасибо сказали: 0 раз(а)




Репутация:   0  


Использовать memcpy() у меня не получается (хотя, может, я просто не понял документацию), я получаю мусор в клиенте. Сервер:

p tmp = pList[i];
char buff[sizeof(p)];
memcpy(&buff, &tmp, sizeof(p));
connections[i]->write(buff);

Где QList<QTcpSocket *> connections содержит все подключения. Клиент:

char buff[sizeof(p)];
tcpSocket->read(buff, sizeof(p));
p tmp;
memcpy(&tmp, &buff, sizeof(p));
*cashe = tmp;


Цитата(ViGOur @ 24.7.2012, 19:58) *
реализация своего operator char*()

А что это есть и где про это можно узнать подробнее?

Цитата(Алексей1153 @ 24.7.2012, 20:41) *
сериализация в XML - универсальное в данном случае средство

Не будет ли это заворотом в лишнюю обертку? :mellow: Мне нужно просто синхронизировать данные о классе p.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.7.2012, 8:46
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


сервер
memcpy(buff, &tmp, sizeof(p));

клиент
memcpy(&tmp, buff, sizeof(p));


Цитата(Norrius @ 25.7.2012, 0:16) *
А что это есть и где про это можно узнать подробнее?
В принципе любой из книжек по С++.
Смотри в сторону переопределения операторов, там объясняется как переопределять 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


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Norrius @ 25.7.2012, 2:16) *
е будет ли это заворотом в лишнюю обертку? Мне нужно просто синхронизировать данные о классе p.

я не предлагаю обёртку, я предлагаю гибкий способ передачи
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 26.7.2012, 6:52
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(ViGOur @ 25.7.2012, 9:46) *
сервер
memcpy(buff, &tmp, sizeof(p));
Language: cpp

клиент
memcpy(&tmp, buff, sizeof(p));


Это работает, если класс содержит только простые типы.
Если класс содержит аля QByteArray, QString или любой указатель, то только сериализация или маршалинг.

Цитата(Norrius @ 25.7.2012, 0:16) *
Не будет ли это заворотом в лишнюю обертку? Мне нужно просто синхронизировать данные о классе 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) *
Это работает, если класс содержит только простые типы.

Цитата(ViGOur @ 24.7.2012, 19:58) *
это использование стандартных С++ типов, вроде int, char и ...
;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.7.2012, 10:41
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(ssoft @ 26.7.2012, 9:52) *
Если класс содержит аля QByteArray, QString или любой указатель,


или хотя бы одну виртуальную функцию :) К слову, визард очень любит делать деструктор виртуальным
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.4.2025, 17:38