c++ - UDP 打洞 (c++/winsock)

标签 c++ udp winsock p2p hole-punching

stackoverflow 用户!

我有一个必须处理 p2p 的应用程序,这就是我使用 UDP 打洞的方式。但是我在实现时遇到了麻烦。希望你能给我一些提示。

我有服务器,它工作得很好,可以互相介绍客户端,但客户端无法连接可能是因为我的小 exp 使用套接字。所以,客户端算法是:

  1. 创建 udp 套接字 (socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);)
  2. 通过sendto函数向服务器发送消息
  3. 使用recvfrom locker 函数从服务器获取答案

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

方式一:

  1. 使用同一个套接字通过sendto函数向对等端发送数据,但传递另一个sockaddr
  2. 使用 recvfrom 储物柜函数收听(此时我遇到了 WSAECONNRESET 错误)

方式2:

  1. 创建新套接字
  2. 绑定(bind)
  3. 用它来向对端发送数据

这样一来,一个客户端绑定(bind)失败,另一个客户端监听失败,出现错误 WSAEADDRINUSEWSAECONNRESET。我显然做错了什么,非常感谢您的帮助。提前致谢。

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

最佳答案

如果你read the documentation对于 recvfrom(),它说:

WSAECONNRESET

The virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket; it is no longer usable. On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message.

这意味着您对 sendto() 的调用失败。如果一个或两个客户端都在路由器后面,这是有道理的。根据您的描述(以及缺少代码),您实际上并没有执行任何打洞操作来打开路由器以允许客户端到客户端的数据包通过。您只向服务器发送了一条消息,它允许客户端到服务器和服务器到客户端的数据包通过。每个客户端和服务器之间需要更多的数据包交换才能在每一端执行打洞,如 article you linked to 中的详细描述。 .你真的按照文章所说的去做了吗?

关于c++ - UDP 打洞 (c++/winsock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844711/

相关文章:

c++ - 为什么用项目编译 gtest 而不是使用 lib

c++ - OpenGL 反射没有正确映射天空盒

c++ - OpenCV - 缺少调试 DLL 库

Java帮助将UDP数据包转换为int

c++ - SIP over TCP + 转换为 UDP 以与 SIP 电话通话

python - 看不到来自另一台设备的 UDP 多播消息

c++ - C C++ - TCP 套接字类 : Receive Problem

c++ - winsock 客户端套接字无效

指向数组和 for 循环的 C++ 指针;

java - 将 native Winsock 套接字传递给 Java 套接字