Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Оч важно!


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

Автор: baldina 1.4.2008, 23:25
Код

int i;

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

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

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

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

map: на одном конце передаешь пары key/value, на другом их принимаешь и запихиваешь в map...
протокол в данном случае неважен, все происходит аналогично записи в файл.

Автор: rutr 2.4.2008, 00:48
спасибо за подсказку, только так как написано не сработало, я сделал так:

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 раз, а надо как можно меньше посылок.

Автор: baldina 2.4.2008, 01:05
Цитата

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

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

Цитата

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

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

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

Автор: korian 2.4.2008, 01:47
Цитата(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) могут быть для них разные (из-за выравнивания или еще какой фигни).

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

Автор: korian 2.4.2008, 19:06
судя http://ru.wikipedia.org/wiki/UDP, максимум можно впихнуть 65527 байт данных в один UDP пакет.

Автор: rutr 2.4.2008, 20:10
Спасибо за помощь, тема закрыта!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)