Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оч важно! передача структур по сети 
:(
    Опции темы
rutr
Дата 1.4.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Добрый день! Вопрос такой: есть map<string, userinfo>, ключ - имя пользователя, значение -  структура с данными пользователя, надо содержимое map'а передать по сети другому пользователю. использую udp. Подскажите плз как лучше это сделать? Или хотя бы как можно передать структуру по сети в двоичном виде? Заранее благодарен!

PM MAIL   Вверх
baldina
Дата 1.4.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Код

int i;

видимо как это передать, ты знаешь: 
Код

sendto(s, &i, sizeof (int), ...);

структура точно также:
Код

struct A { int x, y; };
A a;
sendto(s, &a, sizeof (A), ...);

map: на одном конце передаешь пары key/value, на другом их принимаешь и запихиваешь в map...
протокол в данном случае неважен, все происходит аналогично записи в файл.
PM MAIL   Вверх
rutr
Дата 2.4.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



спасибо за подсказку, только так как написано не сработало, я сделал так:

struct A { int x; int y; char str[32]; };
char *buf = new char[sizeof(A)];
memcpy(buf, &a, sizeof(A));
sendto(sSocket, buf, sizeof(A));
delete []buf;

только все же остается вопрос о передачи map'а по сети, так как передавать по паре "ключ - значение" прийдется 255 раз, а надо как можно меньше посылок.

PM MAIL   Вверх
baldina
Дата 2.4.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата

надо как можно меньше посылок

не получится, map - динамическая структура (дерево). a 255 не так уж и много...
можно конечно пары ключ/значение вытащить из map, поместить в массив и его скопом передавать, но смысла имхо в том большого нет. 

Цитата

как написано не сработало

sendto принимает char*? тогда просто приведи к нужному типу:
Код

struct A { int x; int y; char str[32]; };
A a;
sendto(sSocket, (char*)&a, sizeof(A));

PM MAIL   Вверх
korian
Дата 2.4.2008, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



Цитата(rutr @  1.4.2008,  23:48 Найти цитируемый пост)
только все же остается вопрос о передачи map'а по сети, так как передавать по паре "ключ - значение" прийдется 255 раз, а надо как можно меньше посылок.

а в чем проблема? создайте буфер в 255 раз больше и все...
Код

struct A { int x; int y; char str[32]; };
char *buf = new char[sizeof(A) * 255];
char *curpos = buf;
memcpy(curpos, &a, sizeof(A));
curpos += sizeof(A);
memcpy(curpos, &a2, sizeof(A));
curpos += sizeof(A);
memcpy(curpos, &a3, sizeof(A));
...
sendto(sSocket, buf, sizeof(A) * 255);

delete []buf;

только учитывайте, если клиент и сервер будут компилироваться с разными настройками или разными компиляторами, то величины sizeof(A) могут быть для них разные (из-за выравнивания или еще какой фигни).

PM   Вверх
rutr
Дата 2.4.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



спасибо, это я понял, а теперь стал вопрос, какое максимальное количество байт я смогу передать за 1 раз по udp? то есть могу ли я передать широковещательную или обычную посылку размером 4096?

Это сообщение отредактировал(а) rutr - 2.4.2008, 17:36
PM MAIL   Вверх
korian
Дата 2.4.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



судя по этому, максимум можно впихнуть 65527 байт данных в один UDP пакет.

Это сообщение отредактировал(а) korian - 2.4.2008, 19:07
PM   Вверх
rutr
Дата 2.4.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Спасибо за помощь, тема закрыта!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.