(Возможно, для ответа на это достаточно знания библиотеки Unix, поэтому, пожалуйста, продолжайте читать, если вы не знаете JoCaml.)
У меня есть две программы в JoCaml . Сервер, готовый вернуть квадрат числа на порту 12345
(* p.ml *)
def f (x) =
print_string ("["^string_of_int(x)^"] "); flush stdout;
reply x*x to f
in Join.Ns.register Join.Ns.here "square" f
;;
let wait =
def x () & y () = reply to x
in x
let main =
Join.Site.listen (Unix.ADDR_INET (Join.Site.get_local_addr(), 12345));
wait()
и клиент, готовый использовать функцию квадрата сервера
(* q.ml *)
let server =
let server_addr = Unix.gethostbyname "192.168.0.10" in
Join.Site.there (Unix.ADDR_INET(server_addr.Unix.h_addr_list.(0),12345))
let ns = Join.Ns.of_site server
let sqr = (Join.Ns.lookup ns "square": int -> int)
let _ = Printf.printf "%d\n" (sqr 3)
Это все работает нормально, если две программы работают на одном компьютере. Но моя цель - поместить их в две разные машины. Таким образом, IP выше должен стать другим публичным IP. Поскольку у меня есть только один компьютер для тестирования, я решил запустить две программы на этом компьютере и вместо общедоступного IP-адреса моей машины записать вместо 192.168.0.10 выше. К сожалению, это не работает, время ожидания истекло.
Есть идеи?
[Изменено]
Подробнее о проблеме
Код, который я написал выше, является примером, который я взял из руководства JoCaml, поскольку это была аналогичная и упрощенная версия моего собственного фрагмента кода, где возник вопрос. Программа, которую я пишу, направлена на создание P2P-сети из сред времени выполнения JoCaml, которая все делает частные вычисления и хранит свои результаты локально, полагаясь на данные, хранящиеся в других узлах сети. Итак, я хочу, чтобы все одноранговые узлы выполняли что-то «похожее» на q.ml, так как им нужно подключаться к другим машинам и получать от них нужную информацию.
Каждый пэр должен иметь список своих пиров. Затем вы можете запросить сеть для некоторого значения простым способом. Каждый узел будет проверять, знает ли он это значение: если да, то возвращает его, если нет, то запрашивает его узлы (и так далее, рекурсивно). Архитектура P2P действительно хороша для моих целей. (Централизованная топология, предложенная Жилем, не будет работать для моей конкретной проблемы из-за проблем с производительностью и надежностью, упомянутых в его ответе.) Я ввел специальный одноранговый узел начальной загрузки, о котором знает весь код, и к которому любой новый узел сначала подключится. получить доступ к сети. Как только новый узел аутентифицирован узлом начальной загрузки, он должен присоединиться к сети и сам стать первоклассным узлом (и с этого момента может игнорировать узел начальной загрузки). Все эти одноранговые узлы будут напрямую взаимодействовать между собой (1-1), поэтому для каждой произвольной пары одноранговых узлов должен быть способ установить связь между ними. Кроме того, поскольку я хотел бы, чтобы кто-либо с соответствующими учетными данными мог присоединиться к этой сети, независимо от их сетевых навыков, у меня не может быть решения, где люди должны были бы настроить свой маршрутизатор для подключения к сети P2P. Они должны просто запустить программное обеспечение из коробки.
Мои требования тогда:
- P2P сеть одноранговых узлов в Интернете (то есть 1-1 соединение между любыми двумя узлами)
- одноранговые узлы могут находиться за непрозрачными маршрутизаторами
- нет конфигурации локального маршрутизатора
- специальный узел начальной загрузки, к которому вы впервые подключаетесь и аутентифицируетесь
То, что у меня сейчас есть, работает хорошо, если нам не требуется 2. Есть предложения по решению исходной проблемы, но в этом контексте P2P?
(Обратите внимание, что инфраструктура P2P - это всего лишь средство для достижения цели. Да, я хотел бы иметь что-то, что хорошо работает, но я не собираюсь разрабатывать окончательную супер-общую платформу P2P для JoCaml. I ' хочу написать простую вещь, которая просто выполняет свою работу.)