当前位置: 首页 > 知识库问答 >
问题:

UDP 打孔 (c /winsock)

王建华
2023-03-14

stackoverflow用户!

我有一个必须处理p2p的应用程序,这就是我使用UDP打孔的方法。但我在执行上遇到了麻烦。希望你能给我一些提示。

我已经有了服务器,它运行得很好,可以把客户介绍给彼此,但是客户不能连接,可能是因为我使用套接字的经验不足。因此,客户端算法是:

    < li >创建udp套接字(socket(AF_INET,SOCK_DGRAM,IP proto _ UDP);) < li >通过sendto功能向服务器发送消息 < li >使用recvfrom locker函数从服务器获取答案

在这3个步骤之后,我得到了对等endpoint。接下来,我尝试以两种方式连接客户端:

方式1:

  1. 使用同一个套接字通过sendto函数向对等方发送数据,但传递另一个套接字
  2. 使用recvfrom Locker函数侦听(此时我收到WSAECONNRESET错误)

方式2:

  1. 创建新套接字
  2. 绑定它
  3. 使用它向对等方发送数据
  4. 听着

这样,一个客户端绑定失败,另一个客户端侦听失败,并出现错误WSAEADDRINUSE和WSAECONNRESET。很明显我做错了什么,非常感谢你的帮助。提前感谢。

附言:想分享一篇关于UDP打孔的好文章,以帮助那些对这项技术不熟悉的人:http://www.brynosaurus.com/pub/net/p2pnat/

共有1个答案

阎咏思
2023-03-14

如果你阅读了 recvfrom() 的文档,它说:

WSAECONNRESET

虚拟电路被远程端执行硬关闭或流产关闭而复位。应用程序应该关闭套接字;它不再可用了。在UDP数据报套接字上,此错误表示先前的发送操作导致了ICMP端口不可达消息。

这意味着对sendto()的调用失败。如果一个或两个客户端都在路由器后面,这是有意义的。根据您的描述(以及缺少代码),您实际上并没有执行任何打孔来打开路由器以允许客户端到客户端数据包通过。您只向服务器发送了一条消息,这允许客户端到服务器和服务器到客户端数据包通过。每个客户端和服务器之间需要进行更多的数据包交换,以便在每一端执行穿孔,如您链接的文章中详细描述的那样?

 类似资料:
  • 我目前正在尝试为我的udp服务器在Android上实现udp打孔。事情应该是这样的: 客户端(在NAT之后;可能是3G,..)向服务器发送DatagramPacket(服务器有一个公共IP;端口也是45555)。客户端重复发送具有给定延迟的数据报 一旦服务器接收到数据报,它每500ms发送一次数据报(“信号”)。 如果穿孔成功,客户端应接收到这些信号 下面是我当前的客户端实现(Android):

  • 问题内容: 可以说我有两台计算机。 他们通过彼此了解公共IP和私有IP 。 一个客户端正在侦听,另一个客户端正在发送一些字符串。 我希望通过UPD打孔看到这种情况: 能否再有一个伪示例说明如何通过对称NAT进行打孔?假设将有服务器S帮助猜测端口号并在客户端A和客户端B之间建立连接。 如果您还要考虑双重NAT,那将是很好的。 注意: 您可以使用STUN查找IP和端口,但是您必须编写自己的代码,以通过

  • 问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传

  • 我正在尝试在Delphi中做TCP打孔。我只有一个端口打开-10000(用于测试目的)。 下面是我的代码片段(完整源代码): 之后,我尝试连接到客户端的内部端口,但我得到错误“连接超时”。 我认为问题是远程客户端找不到要连接的服务器,因为客户端已经与重定向服务器建立了连接。

  • 首先,创建到服务器的UDP连接: 没有任何直接连接(没有ip,没有端口,只是随机端口上的endpoint)。 我使用直接在服务器的ip和端口上发送一些数据包到服务器,并获取有关另一个对等方的信息(远程ip,用于连接到服务器的端口 现在,我试图通过使用服务器连接在对等方的IP:端口上发送简单的UDP数据包(但再次使用直接)来解决问题。我知道第一个数据包总是被丢弃,所以我以100ms的间隔发送它50,

  • 从server-A(可通过静态IP全局访问)开始,我将UDP套接字绑定到0.0.0.0:25000。 然后,在(住宅)NAT 后面使用客户端 A,我将 UDP 套接字绑定到 0.0.0.0:25000。然后,客户端 A 将数据包发送到服务器 A。 服务器 A 接收数据包。服务器 A 记录远程套接字 K,数据包从中 NAT 开始。服务器 A 向 K 发送数据包,目的是 NAT 将数据包转发到客户端