Отправка нескольких пакетов очень быстро в C - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь сделать многопользовательскую игру в c, но когда я отправляю несколько пакетов, таких как "ARV 2 \ n \ 0" и "POS 2 0 0 \ n \ 0" с сервера на клиент (с отправкой ()), когда я пытаюсь прочитать их с помощью recv (), он обнаружил только 1 пакет, который выглядит как 2 пакета в 1 ..

Итак, я спрашиваю, это нормально? И если да, как я могу заставить моего клиента читать пакеты 1 на 1? (или мой сервер отправляет их 1 на 1, если проблема возникает из-за отправки вызова)

Спасибо!

1 Ответ

3 голосов
/ 14 марта 2019

Краткий ответ: Да, это нормально. Вы используете TCP / IP, я полагаю. Это протокол потока байтов, «пакетов» нет. Сеть и операционная система на любом конце могут объединять и разделять отправляемые вами данные любым способом, который подходит для некоторых буферов или частей сети. Единственное, что гарантировано, это то, что вы получаете одинаковые байты в том же порядке.

Вам нужно использовать собственный пакетный фрейм. Для текстового протокола разделите пакеты, например, '\0' байтами или символами новой строки. Также обратите внимание, что сеть или операционная система могут выдавать вам частичные пакеты за одно «чтение», поэтому вам необходимо обрабатывать это и в своем коде. Это проще всего, если разделитель пакетов состоит из одного байта.

Особенно для двоичного протокола, где нет «неиспользуемых» байтовых значений для маркировки границ пакета, вы можете записать длину пакета в виде двоичных данных, затем столько байтов данных, затем снова длину, данные и так далее. Обратите внимание, что поток данных может быть разделен на различные вызовы «чтения» даже в середине информации о длине (если длина не является однобайтовой), поэтому вам может потребоваться на несколько строк больше кода для обработки приема разделенных пакетов.


Другой вариант - использовать протокол UDP, который действительно отправляет пакеты. Но UDP-пакеты могут быть потеряны или доставлены в неправильном порядке (и иметь несколько других проблем), поэтому вам нужно как-то с этим справиться, и это часто приводит к плохому переизобретению TCP. Так что, если вы не заметите, что TCP / IP просто не обрежет его, продолжайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...