См связанные вопрос/ответы здесь: Sending structure using recvfrom() and sendto()
Имейте в виду, что если клиент и сервер имеют различные архитектуры машины (Big Endian против Little Endian) или даже разные компиляторы/интерпретаторы затем отправить сырой структуры не хорошая идея. Я видел случаи, когда машины той же архитектуры не рассматривали структуру структуры так же, потому что компиляторы, используемые для кода клиента и сервера, оптимизировали хранилище структуры по-разному.
Поэтому вместо отправки всей структуры рассмотрим кодирование каждого поля в буфер с помощью htons(), htonl() для целых чисел, longs и т. Д. Затем отправьте этот буфер, а не исходную структуру. На стороне сервера декодируйте полученный буфер, используя ntohs(), ntohl() и т. Д. Для восстановления структуры.
Используя UDP, вы должны знать, что сеть может потерять сообщение. Если ваш клиент и сервер находятся в одной локальной локальной сети, вероятность потерянного пакета низкая. Если клиент и сервер говорят через Интернет, то шансы значительно увеличиваются. Вы можете добавлять сообщения подтверждения и тайм-ауты, но затем вы начинаете идти по пути повторного создания надежного транспорта, такого как TCP (например, вам нужно обрабатывать случаи, когда оригинальное сообщение сделало это, но только подтверждение было потеряно.) Не страшная вещь делать, а просто быть в курсе того, что вы получаете.
Вместо этого вы можете использовать TCP-соединение и, возможно, его открывать для обмена дополнительной информацией между клиентом и сервером. В этом случае вы, вероятно, захотите добавить некоторые значения разделителя между сообщениями и «избежать» этих разделителей, когда они произойдут в служебных нагрузках буфера сообщений.Причина этого в том, что TCP действительно дает вам двунаправленный поток байтов, поэтому вам нужно быть осторожным, когда заканчивается одно сообщение, а затем начинается следующее. UDP является «ориентированным на сообщения» таким образом, что один recvfrom получит одно полное сообщение, тогда как при TCP, когда вы читаете байты из сокета, вы можете читать конец одного сообщения и первые несколько байтов следующего сообщения, таким образом, необходимость для разделителей.
Если вы хотите reliablility, не используйте UDP. Попытки сделать UDP надежными в основном связаны с повторной реализацией TCP, что не является разумной задачей. – 2009-12-11 19:21:51
Почему бы вам просто не использовать tcp, если вам нужна надежность? У вас возникла проблема с объявлением разметки с указанными полями, заполнением его экземпляра и записью его в буфер? – begray
http://stackoverflow.com/questions/107668/what-do-you-use-when-you-need-reliable-udp – sylvanaar