Для отправки динамических данных по сети у вас есть следующие опции.
Первый вариант в том же пакете.
void SendData()
{
int size;
char payload[256];
Send(messageType)
Send(size);
Send(payload)
}
Второй вариант:
void SendData()
{
char payload[256];
Send(messageType)
Send(payload)
}
Хотя в любой ситуации вы столкнетесь с большим выбором дизайна. В первом примере вы отправите тип сообщения, размер полезной нагрузки, а затем полезную нагрузку.
Второй вариант, который у вас есть, это то, что вы можете отправить тип сообщения, а затем вы можете отправить строку с разделителем нуля.
Хотя любой из этих вариантов, я думаю, не полностью покрывает проблему, с которой вы столкнулись. Во-первых, вам нужно определить, разрабатываете ли вы игру, какой тип протокола вы будете использовать, UDP? TCP? Вторая проблема, с которой вы столкнетесь, - это максимальный размер пакета. Кроме того, вам необходимо иметь структуру, чтобы вы могли рассчитать оптимальный размер пакета, который не будет фрагментирован и потерян для Интернета. После этого у вас есть контроль пропускной способности в отношении того, сколько данных вы можете передавать и получать между клиентом и сервером.
Например, способ, которым большинство игр подходят к этой ситуации, заключается в том, что каждый пакет идентифицируется следующим образом.
MessageType
MessageSize
CRCCheckSum
MessageID
void buffer[payload]
В ситуации, когда вам нужно отправлять динамические данные, вы отправляете серию пакетов, а не один. Например, если вы хотите отправить файл по сети, лучшим вариантом будет использование TCP / IP, потому что это потоковый протокол и он гарантирует, что весь поток прибудет на другой конец. С другой стороны, UDP - это протокол на основе пакетов, который не проверяет, все ли пакеты были доставлены в порядке или вообще на другом конце.
Итак, в заключение.
- Для динамических данных отправляйте несколько пакетов, но со специальным флагом
сказать, что больше данных должно прибыть, чтобы закончить это сообщение.
- Будьте проще, и если вы работаете с C ++, не принимайте пакет или данные
будет содержать нулевой терминатор и проверить размер по сравнению с
полезная нагрузка, если вы решите использовать нулевой терминатор.