Как сервер UDP должен отвечать своим клиентам? - PullRequest
3 голосов
/ 04 августа 2011

Мне нужен сервер UDP, который может общаться со многими клиентами.

Мое нынешнее мышление

  1. открыть сокет
  2. привязка к порту
  3. recvfrom клиента
  4. вилка
    • child: обработать сообщение, открыть новый сокет и отправить клиенту
    • родитель: перейдите к шагу 3

Сервер отвечает клиенту на том же порту, к которому подключен клиент, но со случайного порта.

Я реализовал это, и с моим тестовым клиентом это работает.

Однако настоящий клиент написан кем-то другим, где-то еще. (Это встроенная система)

Его клиент ожидает ответа от того же порта, на который он отправил сообщение. Единственный способ, которым я могу это сделать - использовать тот же сокет, который работает.

Однако меня беспокоит, что это вызовет проблемы, если более одного клиента попытается подключиться одновременно.

Как это сделать?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

UDP-сокеты намного проще, чем TCP-. Просто ответьте в том же сокете с sendto(2) с адресом клиента, который вы получили от recvfrom(2). Не нужно путать эти темы, просто сделайте это в цикле.

Редактировать 0:

Чтобы уточнить немного после вашего комментария - когда вы получаете дейтаграмму на сокете UDP, вы не получаете новый дескриптор сокета, как в TCP, поэтому ваш родитель по-прежнему обрабатывает все вводимые данные. Теперь, вы планируете fork(2) - создать новый процесс и затем создать новый сокет для каждого пакета? Или вы хотите отслеживать исходные адреса и сопоставлять их с дочерними процессами и настраивать передачу сообщений от родителя к потомку? Я бы тоже не стал. Накладные расходы слишком велики. Просто сделайте это в строке.

Тогда, если ваша скорость сообщений действительно высокая, а ваша обработка действительно тяжелая - увеличить приемный буфер сокета сервера (SO_RCVBUF, setsockopt(2)), посмотрите на многопоточность вашего сервера, разделив его на части ввода-вывода и обработки, посмотрите на очереди без блокировки и т. Д. Но эта последняя часть - совсем другая история. Начните с простого.

0 голосов
/ 21 марта 2016

Нет необходимости либо форкать, либо создавать новый сокет для отправки клиенту. Вы можете и должны делать все с одним сокетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...