- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经看到并阅读了很多类似的问题,以及相应的维基百科文章( NAT traversal 、 STUN 、 TURN 、 TCP hole punching ),但是大量的信息并不能真正帮助我我的问题很简单:
我正在编写一个 P2P 应用程序,我希望 NAT 后面的我的应用程序的两个用户能够相互连接。连接必须可靠(与 TCP 的可靠性相当),所以我不能只切换到 UDP。该解决方案无需重新配置即可在当今的通用系统上运行。如果有帮助,该解决方案可能涉及可连接的第 3 方,只要它不必代理整个数据(例如,获取对等方的外部 (WAN) IP 地址)。
据我所知,我唯一的选择是使用“可靠的 UDP”库 + UDP hole punching .是否有用于此的 (C/C++) 库?我找到了 enet在related question , 但它只处理解决方案的前半部分。
还有吗?我看过的东西:
最佳答案
ICE 收集要连接的候选 IP/端口目标列表。每个对等点收集这些,然后按顺序对每个候选者运行连接检查,直到检查通过或检查失败。
当 Alice 尝试连接到 Bob 时,她以某种方式获得了一个可能的方式列表 - 由 Bob 确定 - 她可以连接到 Bob。 ICE 称呼这些候选人。 Bob 可能会说,例如:“我的本地套接字是 192.168.1.1:1024/udp,我的外部 NAT 绑定(bind)(通过 STUN 找到)是 196.25.1.1:4454/udp,您可以在 1.2 调用媒体中继(中间盒) .3.4:6675/udp”。 Bob 将其放入 SDP 数据包(对这些不同候选人的描述),并以某种方式将其发送给 Alice。 (在 SIP 中,ICE 的原始用例,SDP 在 SIP INVITE/200/ACK 交换中进行,建立 SIP session 。)
ICE 是可插拔的,您可以配置候选人的准确性质/数量。您可以尝试直接链接,然后向 STUN 服务器请求绑定(bind)(这会在您的 NAT 中打一个洞,并告诉您该洞的外部 IP/端口,您将其放入 session 描述中),然后返回要求 TURN 服务器中继您的数据。
ICE 的一个缺点是您的同行交换 SDP 描述,您可能喜欢也可能不喜欢。另一个是 TCP 支持仍在 draft form 中,这对您来说可能是也可能不是问题。 [更新:ICE 现在正式成为 RFC 6544。]
游戏经常使用 UDP,因为旧数据没有用。 (这就是 RTP 通常在 UDP 上运行的原因。)一些 P2P 应用程序经常使用中间盒或中间盒网络。
IRC 使用中间盒网络:IRC 服务器形成网络,客户端连接到附近的服务器。从一个客户端到另一个客户端的消息可能会通过服务器网络传输。
如果这一切都失败了,您可以看看 BitTorrent 的架构,看看它们是如何处理 NAT 问题的。正如 CodeShadow 在下面的评论中指出的那样,BitTorrent 依赖于网络中可达的对等点:在某种意义上,一些对等点形成了一个中间盒网络。如果这些中间件可以充当中继,您将拥有一个类似 IRC 的架构,但它是动态设置的。
关于networking - 用于可靠网络连接的实用 NAT 穿越,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614319/
我正在尝试运行以下内容:: Press to see code - name: Snapshot BI nodes hosts: [CLUSTER-BI,CLUSTER-BI-REPL
在这里尝试心理重置:我尝试使用 MSMQ 创建一个可靠、持久的堆栈,但没有成功 所以更一般地说: 我有生产者(一个 web 服务,虽然“只有一个”,但也是多线程的)/消费者(多个进程,根据需要设置)。
试图为分布式系统找到一个商业日志框架。此框架必须允许远程服务器上的 .NET 应用程序记录可以在中央位置收集的消息。如果可能,中央位置应将消息存储在 SQL Server 数据库中。 要求: 能够在远
我正在开发 Restful 服务,我们将在数据库中插入/更新新记录。 由于REST使用HTTP进行通信,而HTTP并不可靠,我担心如果连接失败,请求可能无法发送到服务器。 我在 link 中找到的建议
我正在尝试实现一个页面,员工可以在其中登录并添加、修改、更新工作案例。 我有一个选择列表,其中包含从数据库加载的数据(员工姓名)。在这个数据库中,我有基本信息、用户名、ID、密码、电子邮件。 选择列表
我在 C 代码和 Python 代码之间(偶尔)得到略有不同的计算结果,并设法找到了一个例子。在 Python 中,我得到了这个: >>> print "%.55f" %\ ... (-2.49999
例如如果我将计时器设置为每天午夜到期,如果一个“失火”(例如,由于服务器关闭而不会触发回调)会发生什么?我在文档中找不到它。 有没有办法让这个定时器在服务器重启时立即触发回调? PS:我了解 Quar
我有一组不同长度的非零序列,我正在使用 Keras LSTM 对这些序列建模。我使用 Keras Tokenizer 进行分词(分词从 1 开始)。为了使序列具有相同的长度,我使用了填充。 填充示例:
我遇到了一个非常有趣的可靠 session 行为。我正在使用 netTcp 绑定(bind) + 双工 channel + 可靠 session 。 当我尝试在 channel.faulted 上收听
问题: 给定表 table_a 和 table_b,每当 table_a 更新时,我都需要可靠地(并发地)执行这样的操作: SELECT table_a 中的一些行。 在应用程序代码中计算一些内容。
我们目前的设计 环境 Redis 2.8.17 我们已经实现了我们的可靠队列,使用类似于 redis 文档中描述的模式的模式,在 RPOPLPUSH 下 但是,考虑到其阻塞性质,我们正在使用 BRPO
在我们的 WCF 应用程序中,我正在尝试配置可靠的 session 。 服务: 客户:
我使用这个 Delphi 7 代码来检测 Internet Explorer 是否正在运行: function IERunning: Boolean; begin Result := FindWi
我正在准备构建一个应用程序,该应用程序能够向 GPS 设备发送/接收航路点。通过一些谷歌搜索,我发现了很多可能对此目的有用的库: Java Chaeron GPS GPSLib4J Python Py
我有几个关于 WCF 可靠 session 可靠性的问题: WCF 是否在重试期间重新序列化消息? 2。如果 1 是正确的 - 它是否在消息参数被处理后发生? 3. 如果 2 是正确的 - 是否有任何
对于使用 $(this)[0].defaultValue 来确定文本框值是否已从原始值发生变化的一些反馈,我将不胜感激,例如 //keyUp event if($(this)[0].defaultVa
我正在开发一个具有以下特征的实时应用程序: 数百个客户端将同时插入行/文档,每个客户端每隔几秒插入一行。 大部分仅追加;几乎所有的行/文档,一旦插入,就永远不会改变。 只有当数据刷新到磁盘时,客户端才
场景:最终用户(不受信任的)提供了一个字符串,例如 "Hello, {name}!" .在服务器上,我想以 my_string.format(name="Homer") 的形式对该用户提供的字符串进行
我在推送通知方面遇到一些问题。我们使用 Firebase 来推送通知。问题是我可以在一台 iPhone 上正确接收 PushNotifications,但无法在另一台 iPhone 上接收它们。我在
从 python 到 c++,这是我能得到的最接近 python 的装饰器。 这个解决方案感觉有点像 hack,因为在要装饰的函数之后运行的代码在 Timer 析构函数中是隐式调用的。不过它确实有效。
我是一名优秀的程序员,十分优秀!