Решил попробовать свои силы и сел за написание MMORPG, информации по разработке протокола так и не нашел, поэтому формирую сетевые сообщения следующим способом: структуру или тип данных перевожу в двоичный вид и передаю.
Как лучше передавать данные? Как насчет передачи данных в виде XML или просто текстом?
можети кто ссылочки на статьи даст.
Пакеты состоящие из набора объектов, каждый состоящий из пар пронумерованных полей и значений.
Сжимаются каким нибудь gzip.
kvakvs, а можно по подробнее.
у меня сейчас например так:
[тип данных][длина данных][данные] У некоторых данных может длина отсутствовать
пример как строка передается [2][5][привет]
И как скажется на быстродействии упаковка и распаковка?
И еще вопрос лучше передавать данные одним большим пакетом или можно и мелкими пакетами, это будет не критично?
travnik
> [тип данных][длина данных][данные]
почти у всех так =))
вообще впринципе существут только два способа
1.а) передавать размер прикрепленных данных перед пакетом (в заголовке пакета)
1.б) не передавать размер данных, но передавать тип пакета, но по типу пакета размер данных должен определятся однозначно
2) использовать "разделительный символ". отдялять пакеты друг от друга специальным символом или последовательностью. - тут есть одна проблема, то что эта последовательность не должна встречатся в данных (т.е. данные надо преобразовывать нужным образом перед отправкой) вобщем способ применяют как правило только в тексовых протоколах, ну либо в тех в которых точно есть "неиспользуемые" символы
travnik
> И как скажется на быстродействии упаковка и распаковка?
для маленьких пакетов - она будет только мешать. так как упаковвка пакета размером даже в сотни байт будет скорей всего увеличивать размер данных. а пакеты в играх как правило гораздо меньше по размерам
"лучше передавать данные одним большим пакетом или можно и мелкими пакетами, это будет не критично"
Чем реже передаешь, тем всем будет легче ))
travnik
> можно и мелкими пакетами, это будет не критично?
сеть забивается количеством пакетов : )
прям как дороги, если бы в каждом 5-ти местном седане было больше, чем один водитель, например другие водители согласились бы ехать пассажирами, глядишь пробочек бы и не было
возвращаясь к сети, пакеты надо набивать под завязку, т.е. MSS
сериализаця может быть любой, xml, бинарной, base64, - на что хватит навыков и терпения : )
если принята схема заголовок-данные, упаси бог посылать их раздельно, в худшем случае возникнет конфликт между алгоритмом отложенных подтверждений и алгоритмом Нейгла, данные начнут приходить с непонятными затыками в 40 мс. даже на loopback
использовать writev/WSASend для отправки нескольких (в данном случае двух, заголовок-данные) буферов
Sh.Tac.
> если принята схема заголовок-данные, упаси бог посылать их раздельно, в худшем
> случае возникнет конфликт между алгоритмом отложенных подтверждений и
> алгоритмом Нейгла, данные начнут приходить с непонятными затыками в 40 мс. даже
> на loopback
O_O да ну? у меня все нормально приходило.
Да ну эт понятно что не по одному типу данных отсылать. Вручную перевожу в двоичный вид и складываю по несколько штук.
travnik
> Вручную перевожу в двоичный вид
какой двоичный вид? ты о чем? с какой луны свалился?
а вообще отдельно слать пакеты или вместе их класть в функцию send - БЕЗ РАЗНИЦЫ при влкюченном алгоритме Нейгла, а по-умолчанию он включен ))
Kloun, бинарный вид, а как еще то? Пишу на шарпе, там встроенные функции перевода в бинарный вид работают медлено.
XML передавать неэкономично, лишний траффик и при парсинге много текстовой работы для процессора.
возможно ASN.1 поможет отцу русской демократии не изобретать велосипед.
wad, спс посмотрю что за зверь, а то уже замучился велосипеды изобретать)))))
Kloun
> а вообще отдельно слать пакеты или вместе их класть в функцию send - БЕЗ
> РАЗНИЦЫ
чую это надо повторять каждому по 20 раз : )
http://www.gamedev.ru/code/forum/?id=128026&page=2#m21
З.Ы. 40 мс это реальный затык, который я получил между сетевыми серверными компонентами, работающими на одной физической машине под линухом
travnik
> Kloun, бинарный вид, а как еще то? Пишу на шарпе, там встроенные функции
> перевода в бинарный вид работают медлено.
бинарный вид (другими словами двоичный), я понимаю только как представление данных из памяти ввиде двоичного кода, т.е. в двоичной системе счисления. как правило это понятие используется только для того чтобы разделить между собой текстовые и бинарные (т.е. не текстовые, а произвольные) данные. так вот по твоей логике получается, что программа оперирует текстовыми данными? С трудом в это верится =))
я с шарпом не работал. что за функции ты имел ввиду, кооторые "переводят данные в бинарный вид" ?
Sh.Tac.
> чую это надо повторять каждому по 20 раз : )
> http://www.gamedev.ru/code/forum/?id=128026&page=2#m21
почитал погуглил вкурил.
давай проведем мысленный эксперимент:
выполняем такой код (псевдокод)
send(packet.header);
send(packet.data);
что мы получаем? эти два вызова , благодаря алгоритму нэйгла объеденятся в один IP пакет! или нет? если нет, то нафига тогда алгоритм нэйгла нужен? при отключенном алгоритме найгла мы конечно получим описываемый эффект. задержку до 500мс.
либо если мы напишем что-то вроде
send(packet.header);
Sleep(1);
send(packet.data);
вот тут вполне вероятно, если сеть не загружена, нарваться на указанную неприятность.
Тема в архиве.