【发布时间】:2012-11-30 10:47:14
【问题描述】:
stackoverflow 用户!
我有一个必须处理 p2p 的应用程序,这就是我使用 UDP 打孔的方法。但我在实施时遇到了麻烦。希望你能给我一些建议。
我有服务器,它运行完美,可以互相介绍客户端,但客户端无法连接可能是因为我的小 exp 使用套接字。所以,客户端算法是:
- 创建 udp 套接字(socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);)
- 通过sendto函数向服务器发送消息
- 使用 recvfrom 储物柜功能从服务器获取答案
在这 3 个步骤之后,我得到了对等端点。接下来,我尝试通过两种方式连接客户端:
方式1:
- 使用同一个套接字通过 sendto 函数向对等方发送数据,但传递另一个 sockaddr
- 使用 recvfrom 储物柜功能收听(此时我收到 WSAECONNRESET 错误)
方式2:
- 创建新套接字
- 绑定它
- 使用它向对等方发送数据
- 听着
这样,一个客户端绑定失败,另一个客户端监听失败,出现 WSAEADDRINUSE 和 WSAECONNRESET 错误。我显然做错了什么,您的帮助将不胜感激。提前致谢。
附:想分享一篇关于 UDP Hole Punching 的好文章,以帮助那些不熟悉这种技术的人:http://www.brynosaurus.com/pub/net/p2pnat/
【问题讨论】:
-
试试看这个问题:stackoverflow.com/questions/8819118/tcp-hole-punching 虽然用UDP做这个一定更容易
标签: c++ udp winsock p2p hole-punching