Беркли сокет связи, отправлять и получать структуры
У меня есть задание, где я собираюсь внедрить счет-сервер для игры. Когда игра будет завершена, игра отправит () имя игрока (char *name) и счет (int score) на сервер для регистрации, receive(), и сервер отправит обратно 5 лучших результатов.
Мы собираемся использовать сокеты Беркли и C. После некоторого чтения и изучения примеров я могу найти только те примеры, которые просто отправляют отдельные переменные.
write(sd, "Hello World", 12);
char buf[13];
read(sd, buf, 12);
buf[12] = '\0';
Что обычно делать? Отправить каждую переменную (имя и оценку) отдельными функциями write(), или создать структуру, которая содержит обе переменные?
После прочтения "Руководства по сетевому программированию" Биджа я натолкнулся на проблему с порядком байтов (big / little -endian), которую я должен принять во внимание, это показано в разделе 7.4 Сериализация - Как упаковать данные, и все в порядке, за исключением того, что во всех пакетах примеров кода они плавающие и одиночные переменные, есть ли способ упаковать всю структуру?
Есть также раздел 7.5 Sone of Encapsulation, в котором рассказывается о создании протокола, описывающего, как клиент и сервер взаимодействуют, для меня это больше похоже на структуру и то, что я хочу делать, но нет кода, который демонстрирует этот принцип.
Вкратце: я хочу создать стабильную связь между сервером и клиентом, где я обмениваюсь не только отдельными переменными,
1 ответ
В сетевой коммуникации нет понятия переменных или структур. То, что вы делаете, это отправка последовательности байтов.
Таким образом, идея отправки структур аналогична отправке одного значения: преобразовать структуру в последовательность байтов (сериализация), записать ее в сокет, а на другом конце преобразовать последовательность байтов обратно в структуру (десериализации).
Итак, теперь ваша проблема превращается в сериализацию: как мне сериализовать структуру?
Который является просто композицией сериализации отдельных значений структуры.
Что чаще
Обычно вы хотите уменьшить объем сетевого трафика. Таким образом, если у вас есть все данные, которые вы хотите отправить заранее, отправка их за один раз будет более эффективной, чем ручная обработка данных по частям, посылая каждую пару имя / счет отдельно.