- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(可能只需了解 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应该成为其他一些公共(public)IP。由于我只有一台机器来测试这个,我决定在该机器上运行这两个程序,并写入我机器的公共(public)IP,而不是上面的192.168.0.10。不幸的是,它不起作用,连接超时。
有什么想法吗?
[已编辑]
我上面写的代码是我从 JoCaml 手册中获取的示例,因为它是我自己出现问题的代码的类似简化版本。我正在编写的程序旨在创建一个 JoCaml 运行时的 P2P 网络,这些运行时都进行私有(private)计算,并依赖于存储在网络其他对等点中的数据在本地存储其结果。因此,我希望有一组对等点都运行与 q.ml 类似的东西,因为它们需要连接到其他机器并从它们获取所需的信息。
每个对等点都需要保留其对等点的列表。然后,您可以以简单的方式在网络中查询某些值。每个对等点都会检查它是否知道该值:如果知道则返回该值,如果不知道则询问其对等点(依此类推,递归地)。 P2P 架构非常适合我的目的。 (吉尔斯建议的集中式拓扑不适用于我的特定问题,因为他的答案中提到了性能和可靠性问题。)我引入了一个特殊的引导对等点,所有代码都知道它,并且任何新对等点将首先连接到该对等点访问网络。一旦新的对等点通过引导对等点的身份验证,它就应该加入网络并成为自己的一流对等点(并且从那时起可能会忽略引导对等点)。这些对等点都将在它们之间直接通信 (1-1),因此需要有一种方法让任意一对对等点在它们之间建立连接。另外,由于我希望任何具有适当凭据的人都能够加入该网络,无论其网络技能如何,因此我无法提供人们需要配置路由器才能加入 P2P 网络的解决方案。他们应该直接运行开箱即用的软件。
我的要求是:
如果我们不需要的话,我目前所拥有的效果很好 2. 对于解决最初的问题,但在这个 P2P 环境中,有什么建议吗?
(请注意,P2P框架只是达到目的的一种手段。是的,我想要一些运行良好的东西,但我不打算为JoCaml开发终极的超通用P2P框架。我'我希望写一个简单的东西来完成这项工作。)
最佳答案
(我认为您的问题在于 IP 网络拓扑,而不是编程本身,但您需要了解此背景才能在 JoCaml 中进行编程。)
很久以前,互联网上的每台计算机都有一个 IP 地址,如果您知道该计算机的 IP 地址,您就可以与该计算机进行通信。 (路由器的每个接口(interface)都有一个 IP 地址,但这只是网络管理员关心的问题。)啊,为了过去的美好时光的简单性。
现在事情变得更加复杂了。 Intranet 上的计算机通常具有仅在该 Intranet 上有效的地址,即所谓的 private address 。 192.168.0.10就是这样一个私有(private)地址。您只能与该 Intranet 内具有私有(private)地址的计算机进行通信。当计算机需要与外部建立连接时,network address translation (NAT)用于使特定的连接工作。 NAT 为内网计算机提供了一个公共(public)地址,但仅对特定连接有效。
我怀疑您遇到的网络拓扑如下所示,其中 A
是您的计算机,C
是您最终使用的另一台计算机,R
是您的家庭或办公室路由器,1.2.3.4 是您所说的计算机的公共(public) IP(实际上是您的网络):
C [5.6.7.8] ←———→ [1.2.3.4] R [192.168.0.1] ←———→ [192.168.0.10] A
在这种情况下,C
无法使用 192.168.0.10 地址与 A
通信,因为该地址仅在 Intranet 上有意义。如果 C
完全可以与 A
通信,则它必须使用 1.2.3.4,并且必须将 R
配置为中继寻址到 1.2.3.4 的数据包到 A
(在典型配置中,R
只会在某些 TCP 或 UDP 端口上执行此操作(如果有的话)。但是 A
无法使用 1.2.3.4 作为地址与自身对话:如果来自内部,这很可能只能到达 R(如果有的话)。
这个问题——网络中的参与者没有全局可见且唯一的地址——在理论上是可能的,但解决起来很烦人,在实践中也是可能的,但解决起来很烦人。据我所知,Jocaml的库使用IP地址和端口号来唯一地、全局地标识分布式程序中的节点。 .
考虑到现代网络拓扑的复杂性,它通常有助于将问题分为两部分:让机器相互通信,以及实际运行分布式程序。第二部分是在 JoCaml 中编程时您正在做什么。对于第一部分,ssh是首选工具。决定一台计算机或一个网络区域(Internet 或 Intranet)作为程序运行的域,并使用 SSH 隧道将该域外部的每台计算机连接到域中的计算机。这种方法并不适合所有用例:域外两台机器之间的通信将通过域,这可能会带来性能和可靠性问题。为了超越这一点,您需要配置您的网络,以便每个参与者都有一个对其他每个参与者都可见的地址(您可能无法做到这一点,具体取决于您在网络上被允许执行的操作)涉及路由器);或者为 JoCaml 实现一个非全局地址模型(这将很有趣且有用,但需要付出很多努力)。
关于sockets - 乔卡姆 : problems with remote connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5209350/
有什么区别 git ls-remote --heads origin 和 git ls-remote . "refs/remotes/*" ? --heads origin 版本需要一段时间才能运行,
当我执行 git remote -v 时,我得到了 origin git@xxx.yyy.cc:name fetch) origin git@xxx.yyy.cc:name (push) 为什么
要构建我的远程环境,我需要设置几个环境变量(它们在 docker-compose 文件中使用)。这些是在我的 ZSH 环境中设置的,因此从终端运行 docker-compose build 可以按预期
我有一个创建多个 Docker 镜像的项目。我想在 vscode-remote 中为每个图像设置一个 devcontainer,以便我可以为每个图像启动一个容器。 我一次只需要启动并连接到一个容器/图
我设置了以下 Remote : $ git remote korg rorg 以及以下分支: $ git branch -a * (no branch) remotes/korg/gingerbr
这是我得到的错误。我有一个简单的 .Net Remoting 设置。连接空闲几分钟后出现此错误。 对象“/7966b546_734e_410d_817a_a0e701f114f6/lfxehvbczn
我有两个远程 git 分支(称它们为“RemoteA”和“RemoteB”)。 “RemoteB”在过去的某个时候从“RemoteA”中分离出来。在那之后,许多提交已应用于两个分支,但我现在希望“Re
我知道使用下面的 git 命令我可以列出我所有的“远程”分支... [someone@someone-pc somerepo]$ git ls-remote Username for 'https:/
我最需要的是一些建议。 我有以下示例: 应用程序1.exe - 有对象 MyList 应用程序2.exe - 需要访问 MyList 并与对象交互,就好像它是从 Application2 创建的一样。
我有一个大型应用程序,它通过 .net 远程处理使用 COM 从 Web 层调用到中间层。在此模式下启动和运行非常慢。 COM 边界的两边都是我们的代码。 我希望能够(可选)在单个进程中运行它。相当多
假设我有两个 Remote :origin 和 upstream。有没有一种方法可以将对象 upstream 推送到 origin,以便其他从 origin 克隆我的 repo 的人能够运行像 git
简而言之; 如何删除远程多个 merge 的 Remote ? 更多背景; 我有一个 git 存储库,其中包含数十个已 merge 到 master 中的 Remote 。我可以使用以下方法一次删除这
我有一个仓库的本地 git clone。我当然可以使用 git remote 查看我的本地远程 origin。但是,我可以看到我的 Remote origin 的 Remote 吗?我可以查看有关这些
先决条件 - 远程服务器和客户端均已设置,客户端能够通过客户端激活的业务对象在服务器端调用方法并从服务器端接收事件。 在保持服务器和客户端运行的情况下更改远程服务器的IP地址,客户端仍然可以执行上述任
我正在设置一个新的远程主机,每次启动它时,我都会收到以下错误输出:有关如何解决此问题的任何反馈或指示? Pseudo-terminal will not be allocated because st
我只是不明白 Git 的帮助页面。那么会发生什么或有什么区别? 假设我有一个带有子模块 B 的 Git 项目 A。子模块 B 确实有一个子模块 C。克隆存储库后,A 指向 B 的特定提交。B 指向 C
我在 Java 中使用 rmi。但是有一个 ExportException“远程对象实现非法远程接口(interface)”。 这是我的代码,有人可以帮帮我吗? public interface Re
我对 git 越来越熟悉了,但是我遇到了一些让我困惑的事情。我们在这里使用本地镜像,因为我们的线路很慢。为了指向镜子,我在 .gitconfig 中有一些常用的东西。 当我想推送时,问题就来了。看来我
我设置了一个带有 conan“远程”存储库的 jfrog artifactory 来代理官方 conan-center 存储库。我看到三个不同的 conan-center URL,具体取决于我阅读的来
我无法使用 VSCode 远程 SSH 在我的远程服务器上保存任何文件,因为我不是 root 用户。 我关注了 official documentation关于如何使用 SSH 配置文件设置 ssh
我是一名优秀的程序员,十分优秀!