В настоящее время я нахожусь в личном проекте для обучения. Я хочу подключиться к UDP для приложений, таких как игры. Каждая отправленная датаграмма имеет определенный заголовок, который указывает, к какому «логическому» каналу он принадлежит, например, канал 0 подобен UDP с дополнительными служебными данными заголовка, а в канале 1 используется большее количество заголовков для обеспечения некоторой дополнительной надежности. Целью каналов является «автоматическое» разделение сообщений на логические группы, вплоть до определенной суммы.. Net Socket (UDP) Отправка, получение и планирование
В моем текущем коде, есть простой цикл в отдельном потоке, который обрабатывает отправки и получения:
// This is pseudo code
public void Tick() {
if(Socket.Poll) {
do {
ReadMessage();
} while(Socket.Available > 0)
}
SendQueuedOutgoingMessages();
}
Хотя это работает на идеальном мире, у меня есть ощущение, что эта логика терпит неудачу, когда есть слишком много входящих или исходящих сообщений. Можно ли использовать один и тот же сокет для одновременной отправки и получения сообщений (например, передача и получение являются асинхронными или в разных потоках)? Даже если это возможно, было бы лучше, если бы я просто использовал два или более UDP-сокета (или смешивал сокеты TCP и UDP, если мне нужна надежность), имея в виду особую поддержку?
Самая непосредственная альтернатива, с которой я могу думать, заключается в использовании алгоритма планирования для управления количеством сообщений для чтения и отправки с помощью размеров очередей или других факторов, но в этой ситуации это становится неустойчивым и негибким.
Редактировать: добавив дополнительную информацию о коде.
Метод Tick() определяется как определенное количество раз в секунду, если он немедленно возвращается. Например, 30 раз в секунду, если нет новых сообщений о входе или выходе, и меньше, если требуется некоторое время для отправки или получения данных. Я использовал блокировку методов ReceiveFrom и SendTo, чтобы избежать ожидание ожидания или вызовов, таких как Sleep (0).
Хотя я сразу же обрабатываю входящие сообщения, я использую очередь исходящих сообщений, чтобы помочь с идеей каналов.
Под «select» вы подразумеваете обнаружение всякий раз, когда есть что-то отправить/получить, а затем выполнить соответствующую асинхронную операцию как можно скорее? В этом случае правильно ли предположить, что Socket может асинхронно выполнять операцию «Отправить и получение» одновременно? – Kirlim
не в то же время, но вы проверяете, действительно ли можно отправить что-то перед отправкой, и вы также проверяете, есть ли что-нибудь, что можно получить. Таким образом, вы никогда не блокируете. Предположим, что вы выполняете отправку, и очередь заполнена, вы должны заблокировать отправку, и пока очередь будет заполнена, вы не получите ее, даже если она может быть получена. Сетевое программирование - это действительно передовая тема, и код легко усложняется. –
Я принял этот ответ. Было бы неплохо, если бы вы могли добавить свой комментарий к ответу, поскольку это связано с вопросом. – Kirlim