Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有中央服务器的P2P握手_C#_.net_Networking_Network Programming_P2p - Fatal编程技术网

C# 没有中央服务器的P2P握手

C# 没有中央服务器的P2P握手,c#,.net,networking,network-programming,p2p,C#,.net,Networking,Network Programming,P2p,我编写了一个客户端服务器应用程序,用于通过局域网交换文件(除其他外)。在服务器模式下,应用程序侦听具有特定标识头的TCP连接。在客户端模式下,它尝试建立到用户提供的IP地址的TCP连接 我现在需要调整此应用程序以在internet上工作。没有太多接触网络编程的机会,我不知道如果没有某种中央服务器(用于宣布存在等),如何实现这一点。这不是一个选择 假设我的应用程序在我的机器上以服务器模式运行,该机器位于家庭网络后面。你(读者)的应用程序处于客户端模式,我们需要连接。我们俩都没有静态IP地址。客户端

我编写了一个客户端服务器应用程序,用于通过局域网交换文件(除其他外)。在服务器模式下,应用程序侦听具有特定标识头的TCP连接。在客户端模式下,它尝试建立到用户提供的IP地址的TCP连接

我现在需要调整此应用程序以在internet上工作。没有太多接触网络编程的机会,我不知道如果没有某种中央服务器(用于宣布存在等),如何实现这一点。这不是一个选择

假设我的应用程序在我的机器上以服务器模式运行,该机器位于家庭网络后面。你(读者)的应用程序处于客户端模式,我们需要连接。我们俩都没有静态IP地址。客户端是否有办法到达服务器?服务器和客户端都可以计算出它们的公共IP地址,但除此之外,我不知道该怎么办

任何指导都将不胜感激


编辑:根据答案,需要进行一些澄清。我的问题不是关于发现。客户端和服务器都可以查询它们的公共地址,用户可以通过其他介质交换这些IP。问题是,一旦知道对方的IP,但双方都在没有适当端口转发的网络后面,如何建立连接。例如,我的应用程序使用端口51200作为TCP的默认端口。

几个月前,我正在寻找类似的解决方案,但不幸的是,我被卡住了,从此放弃了它

人们说你可以使用或,但我无法做到这一点(尽管我不是计算机网络专家)。它能否工作取决于网络本身


这是我最初问的问题,也许会对你有所帮助。老实说,我不想扼杀你的希望,但我担心这可能是一条死胡同(

几个月前,我正在寻找类似的解决方案,但不幸的是,我被卡住了,从此我放弃了它

人们说你可以使用或,但我无法做到这一点(虽然我不是计算机网络专家)。它是否有效取决于网络本身


这是我最初问的问题,也许会对你有所帮助。老实说,我不想扼杀你的希望,但我担心这可能是一条死胡同。(

我认为如果没有某种中心位置来“找到”彼此,这是不可能的。你需要一些方法让客户端找到服务器ip地址来连接


另外,udp或tcp打孔是一种完全不同的东西,使用的是,猜猜看:一个中央服务器。

如果没有某种中心位置来“查找”彼此,我认为这是不可能的。客户端需要某种方法来查找要连接的服务器ip地址


另外,udp或tcp打孔是完全不同的事情,使用的是,猜猜看:一个中央服务器。

如果你使用IPv6,这是可能的,但你仍然需要知道其他方的地址。如果你使用DynDns服务,这也是可能的,但这已经是一种中央基础设施。

如果你使用IPv6,这是可能的,但你需要知道仍然需要知道其他方的地址。如果您使用DynDns服务也是可能的,但这已经是一种中央基础设施。

我了解到,在两个对等方之间获得真正直接连接的UDP打孔技术是不完善的,因为可能涉及NAT类型的一些组合。这意味着我单独打孔并不总是有效的

声称100%可操作性的方法是,在p2p连接不可能的情况下,使用中继服务器。发现真正的p2p连接是否可能的过程已经通过ICE、TURN和STUN进行了标准化。我所知道的是,使用ICE/TURN/STUN似乎是颠覆NAT问题的标准化策略。它可以在可用的情况下建立真正的p2p连接,并在必要时提供中继服务

注意:我在这个答案中使用p2p这个术语来区分两个端点之间真正的直接连接,不要与重叠网络等混淆

高级用户:通过引入更复杂的策略来配合对称NAT行为(如端口预测等),可以获得更直接的p2p连接。但是实现这些方法的库成本高昂,而且对于DIY工作来说似乎太难了

我没有详细解释不同类型的NAT连接的可能性。你会想研究NAT类型以及它们与UDP打孔的关系。有RFC存在,我会尝试用链接更新我的答案。但问题是,你可以通过重新关注实现TURN/STUN/ICE,learn来避免很多这种学习它们是如何实现的,以及您如何使用它们的标准化行为

潜在解决方案
  • -包含用于C/C++的独立高级NAT遍历库,还具有用于其他语言的绑定。如果您只需要NAT遍历库子组件,请参阅
  • -构建在XMPP上的P2P(对等)和RTC(实时通信)堆栈。请注意,许多LibKingle实现无法与实际的XMPP Kingle规范和附属规范互操作
这些可能会给程序增加相当大的复杂性,这就是为什么自己可以强制实现一些机制的原因

文件
IETF RFCs

  • (iirc,TURN使用眩晕服务器。)
微软
笔记 我听说最终迁移到IPv6可能会解决NAT穿越问题