Если вы не будете осторожны, то, что вы предлагаете, является дырой в безопасности. Так что будьте очень внимательны, особенно когда доверяете сетевому вводу.
Вы не указали TCP или UDP, поэтому я просто дам вам общие рекомендации.
Для TCP или UDP просто выделите один буфер размером N, где N — это максимальный размер сообщения, которое вы могли бы отправить с удаленного игрока или сервера. Для UDP я бы рекомендовал не превышать 1500 байт. Для TCP у вас могут быть большие размеры.
Для вашего сокета, будь то UDP или TCP, сделайте его неблокирующим. Это делается для того, чтобы вы не зависали в игровом цикле, ожидая данных.
Добавьте размер и контрольную сумму в заголовок любого сообщения. Когда вы получаете сообщение в виде UDP-пакета, если размер в заголовке пакета больше N (что означает, что вы уже получили усеченный пакет) или хэш не соответствует тому, что вы вычислили для полученного размера, просто отклоните пакет. Я называю это, потому что без дополнительных проверок целостности хакеры и мошенники будут использовать структуру вашего пакета, чтобы победить.
Для TCP вы, по сути, формируете свои сообщения так, как вы описываете. Каждое сообщение имеет заголовок, определяющий количество байтов, которые должны следовать. Но сделайте то же самое, что и я для UDP, — добавьте собственный заголовок для проверки целостности. Закройте сокет, если вы когда-либо получите повреждение сообщения и ASSERT.
В TCP из-за сегментации TCP вы можете не получить все сообщение в одном и том же вызове "recv". То есть, если вы получили только частичное сообщение, сохраните его во временном буфере. При последующем вызове recv (в следующем игровом кадре) добавьте в этот буфер. Вам придется хранить переменные для отслеживания ожидаемого конца сообщения, чтобы случайно не прочитать следующее сообщение, которое могло быть отправлено.
Удачи.
person
selbie
schedule
23.03.2010