Как выделенный Сервер уведомляет Клиентов друг о друге в p2p (TCP)

Я изучаю сетевое программирование и хочу создать простую P2P-сеть на основе TCP-соединения.

Пока у меня есть сервер, который принимает подключения от клиентов (TCP). Клиенты знают о начальном местоположении сервера.

Это мои вопросы:

  1. Как сервер может уведомлять клиентов друг о друге? это просто отправка списка IP-адресов всех тел всем?

  2. Если все клиенты работают на одном компьютере (например, 127.0.0.1), нужно ли им использовать разные номера портов при соединении друг с другом?

  3. Если я хочу поддерживать TCP-соединение, как коллеги решают, кто будет клиентом, а кто — сервером в каждой паре? Возможно, это можно сделать на стороне сервера, когда он отправляет информацию клиентам.

Я предполагаю, что TCP-соединение не является идеальным в этом сценарии, по крайней мере, по той причине, что клиенты должны поддерживать отдельное соединение для каждого узла в сети. Хотя это скорее тренировочное упражнение, и я ищу надежное соединение, где мне не приходится сталкиваться с возможностью потери или сбоя некоторых пакетов. (на данном этапе:).

Спасибо!

-1

Решение

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

Что касается второго вопроса, если клиент также должен выступать в качестве сервера для других клиентов, у них нет выбора, так как каждый клиент должен привязаться к локальному адресу (пара ip-адрес / номер порта) и если один порт на конкретный IP-адрес используется, тогда вы должны выбрать другой. Это можно автоматизировать, установив порт в ноль при привязке, и операционная система выберет порт для вас.

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

Что-то вроде этого:

  1. Клиент A, B, C и D подключается к серверу
  2. Клиент А отправляет запрос на сервер
  3. Сервер отправляет запрос клиенту B, C и D
  4. Клиент B и D отвечает, что у них есть то, что было запрошено
  5. Сервер отправляет информацию обратно клиенту A
  6. Клиент A подключается к клиентам B и D

Теперь клиенты B и D действуют как клиенты и как серверы. Это также решает вашу первую проблему, поскольку сервер отправляет информацию о других клиентах только при необходимости.

1

Другие решения

  1. Я думаю, что ответ — да.
  2. Вы также можете использовать другие механизмы Linux IPC, такие как общая память, а не сокет для клиентов на одном сервере.
  3. Роль сервера / клиента различается при установлении соединения: сервер прослушивает / принимает, а клиент подключается. После того, как соединение установлено, они находятся в одноранговом отношении.
1

По вопросам рекламы [email protected]