Протокол сокета UDP - PullRequest
       20

Протокол сокета UDP

1 голос
/ 22 февраля 2011

Я разрабатываю протокол UDP, для которого требуется только один клиент и один сервер, однако мне бы хотелось иметь возможность поддержки нескольких клиентов или, что еще лучше, нескольких клиентов на одном компьютере.

Когда клиент подключается к серверу, сервер получает IP-адрес клиента и исходящий UDP-порт вместе с сообщением.Тем не менее, я не имел никакого успеха в ответе клиенту через этот исходящий порт.

Я предполагаю, что мой вопрос о том, как правильно реализовать нечто подобное, если данные должны отправляться в обе стороны (клиент-сервер и сервер обратно-клиент).Теперь мне кажется, что одного сокета будет недостаточно, и что и клиент, и сервер должны поддерживать как «слушающий» сокет, так и отдельный «отправляющий» сокет.Отправляющий сокет также должен быть повторно открыт и закрыт, если получатель меняется.Возможно, сервер будет иметь один сокет отправки на подключенного клиента.

Поскольку кажется, что исходящий порт UDP не является действительно полезным значением, я должен отслеживать порты из моего протокола, чтобы два клиента на конкретной машине могли работать со своими индивидуальными портами прослушиванияпередайте это на сервер, и сервер просто отправит данные на соответствующие порты после явного уведомления о том, что они собой представляют.

Редактировать: Хорошо, я не хочу ответа «Использовать TCP»,даже если это может быть правильный ответ.Я немного опишу приложение: я управляю оборудованием удаленно в режиме реального времени через Интернет.Я хочу, чтобы задержка была как можно меньше, а целостность данных TCP и гарантии порядка просто не помогут.Мне просто нужен кто-то, кто знаком с сетевым кодом на основе дейтаграмм, чтобы помочь мне убедиться в правильности моего подхода.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Поскольку UDP не имеет состояния и с потерями, вы уверены, что это правильный выбор? Есть ли причина, по которой вы выбрали UDP вместо TCP?

РЕДАКТИРОВАТЬ: Что вы используете, когда вам нужен надежный UDP? может стоить прочитать, если вы его не видели, там обсуждаются различные варианты на основе UDP, которые, я думаю, могут быть полезны для Если вы решите, что вам обязательно нужно пройти по UDP-маршруту.

1 голос
/ 22 февраля 2011

Ваш первый инстинкт был верным.С UDP вам требуется только один сокет на стороне сервера и один сокет на стороне клиента.Обе стороны используют этот сокет как для отправки, так и для приема, а в случае сервера он может использовать этот один сокет для связи с несколькими равноправными узлами.

Сервер должен сохранить адрес клиента, предоставленный вызовом recvfrom()и используйте его в качестве пункта назначения при вызове sendto() при ответе этому клиенту.

Клиент должен проверить, что адрес, предоставленный вызовом recvfrom(), соответствует серверу, на который он ожидал получить ответ от(или, альтернативно, connect() сокет, который отфильтровывает фиктивные ответы).

Если этот подход не работает, то в вашем коде есть ошибка - но она равна правильный подход.

...