Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Networking P2P-NAT穿越_Networking_Tcp_P2p_Nat_Hole Punching - Fatal编程技术网

Networking P2P-NAT穿越

Networking P2P-NAT穿越,networking,tcp,p2p,nat,hole-punching,Networking,Tcp,P2p,Nat,Hole Punching,我正在用C/POSIX做一个P2P应用程序,我被NAT遍历所困扰 我阅读了多种方法(MiniUPnP、手动端口转发、TCP/UDP打孔)和很多问题,但我发现了一些问题: miniuppp:我看到transmission cli使用它进行端口转发,所以我下载了的源代码并试图理解它,但它太乱了,于是放弃了。我搜索了一些文档来实现它(比如“这个函数需要那个结构来做一些事情,并且会返回这个”),但没有找到任何有用的东西。(我认为这是最干净的方法,因为它只需要使用为此目的而制作的库。如果有人知道如何使用

我正在用C/POSIX做一个P2P应用程序,我被NAT遍历所困扰

我阅读了多种方法(MiniUPnP、手动端口转发、TCP/UDP打孔)和很多问题,但我发现了一些问题:

  • miniuppp:我看到transmission cli使用它进行端口转发,所以我下载了的源代码并试图理解它,但它太乱了,于是放弃了。我搜索了一些文档来实现它(比如“这个函数需要那个结构来做一些事情,并且会返回这个”),但没有找到任何有用的东西。(我认为这是最干净的方法,因为它只需要使用为此目的而制作的库。如果有人知道如何使用该代码,请帮助我)
  • 手动端口转发:我希望用户不要弄乱路由器的设置,所有工作都应该通过代码完成
  • TCP打孔:我读过关于打孔的文章,我认为这是最简单的方法(我也有一个带有公共IP的VPS,所以我可以像会合服务器一样使用它),但我无法在不同的NAT后面连接两个不同的用户
场景

我有一个主服务器(在VPS上),它记录加入p2p网络的每个对等方,具体情况如下:

  • PeerA加入网络并向服务器发送一对(A_LOCAL_IP:A_LOCAL_PORT)
  • 服务器保存A的公共IP(X.X.X.X)和公共端口(AAA)以及从A发送的情侣
  • PeerB加入网络并将服务器发送到该对(B_LOCAL_IP:B_LOCAL_PORT)
  • 服务器保存B的公共IP(Y.Y.Y.Y)和他的公共端口(BBB)以及从B发送的夫妇
  • PeerA和PeerB都进入for循环,等待accept(),然后它们生成一个线程来处理传入的请求
  • PeerA想和PeerB联系
  • PeerA询问服务器,IP:PeerB的端口
  • 服务器向PeerA发送耦合(Y.Y.Y.Y:BBB)和(B_LOCAL_IP:B_LOCAL_PORT)[如果它们属于同一个NAT,则发送最后一个]
  • PeerA生成一个线程,该线程进入一个for循环,试图通过端口“BBB”连接“Y.Y.Y.Y”,或通过端口“B_LOCAL_port”连接“Y.Y.Y”,或通过端口“B_LOCAL_IP”,而“主线程”进入一个for循环,试图接受连接
  • 服务器向PeerB发送两个端口(X.X.X.X:AAA和(A_LOCAL_IP:A_LOCAL_PORT)
  • PeerB生成一个线程,该线程进入for循环,试图通过端口“AAA”连接“X.X.X.X”,或通过端口“a_LOCAL_port”连接“X.X.X”,或通过端口“a_LOCAL_IP”,而“主线程”进入for循环,试图接受连接
  • 交易是这样的:当我使用(B_LOCAL_IP:B_LOCAL_PORT)对时,它工作正常;当我使用(Y.Y.Y.Y:BBB)对时,它不工作

    在“ECONNREFUSED”的情况下,我使用指数退避,当我尝试使用(Y.Y.Y.Y:BBB)耦合时,它会打印

    连接被拒绝。睡眠1秒
    连接被拒绝。休眠2秒
    连接被拒绝。睡眠4秒
    连接被拒绝。睡眠8秒
    连接被拒绝。休眠16秒
    连接被拒绝。休眠32秒
    最大超时已过期。正在中止…

    当然,当另一个NAT下的人试图加入我的NAT下的同龄人时,也会发生这种情况

    这就是我的问题:

  • 为什么它使用(B_LOCAL_IP:B_LOCAL_PORT)对工作,而不使用(Y.Y.Y.Y:BBB)对工作
  • 我的NAT是否可能有一些配置/体系结构,使其无法实现穿孔

  • 我看不出PeerB试图在哪里建立连接。打孔的目的是两个对等点都试图相互连接,这在你链接的文章中有解释。当你说B_LOCAL_IP:B_LOCAL_PORT工作时,你的意思是在这种情况下,两个对等点都处于相同的NAT下吗?请看这个答案。添加了PeerB尝试建立连接的部分,但仍然不起作用。它们都被connect()卡住了。一段时间后,我得到“errno=110 connect:Connection timed out”对等点A和B在什么模式下?像主动还是被动还是同时打开?我看不出PeerB试图在哪里建立连接。穿孔的要点是,两个对等点都试图相互连接,这在您链接的文章中有解释。当您说B_LOCAL_IP:B_LOCAL_PORT工作时,您的意思是在这种情况下,两个对等点都处于相同的NAT?Pl下吗请参阅此答案。添加了PeerB尝试建立连接但仍不起作用的部分。它们都被connect()卡住了。一段时间后,我得到了“errno=110 connect:connection timed out”,对等点a和B在什么模式下?主动或被动还是同时打开?