UDP Hole Punching (c++/winsock)
UDP Hole Punching (c++/winsock)
stackoverflow用户!
我有一个必须处理p2p的应用程序,这就是我如何进行UDP打孔的方法。但我在执行方面遇到了麻烦。希望你能给我一些建议。
我有一台服务器,它工作得很好,可以将客户端相互介绍,但客户端无法连接,可能是因为我的小exp使用套接字。因此,客户端算法是:
- 创建udp套接字(套接字(AF_INET、SOCK_DGRAM、IPPROTO_udp))
- 通过sendto功能向服务器发送消息
- 使用recvfromlocker函数从服务器获取答案
在这三个步骤之后,我得到了对等端点。接下来,我尝试用两种方式连接客户端:
Way1:
- 使用相同的套接字通过sendto函数向对等方发送数据,但传递另一个sockaddr
- 使用recvfromlocker函数收听(此时我收到WSAECONNRESET错误)
Way2:
- 创建新套接字
- 绑定它
- 使用它向对等方发送数据
- 听着
这样,一个客户端绑定失败,另一个客户端侦听失败,并出现错误WSAEADDRINUSE和WSAECONNRESET。我显然做错了什么,我们将非常感谢您的帮助。提前谢谢。
p.S.想分享一篇关于UDP打孔的好文章,以帮助那些对这项技术陌生的人:http://www.brynosaurus.com/pub/net/p2pnat/
如果您阅读recvfrom()
的文档,它会显示:
WSAECONNRESET
远程侧执行硬关闭或中止关闭时重置了虚拟电路。应用程序应关闭套接字;它不再可用在UDP数据报套接字上,此错误表示先前的发送操作导致ICMP端口无法访问消息。
这意味着您对sendto()
的调用失败。如果一个或两个客户端都在路由器后面,这是有道理的。根据您的描述(以及缺乏代码),您实际上并没有执行任何穿孔来打开路由器,以允许客户端到客户端的数据包通过。您只向服务器发送了一条消息,允许客户端到服务器和服务器到客户端的数据包通过。每个客户端和服务器之间还需要进行几次数据包交换,才能在每一端进行打孔,正如您链接的文章中详细描述的那样。您真的在做文章中说的吗?
相关文章:
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- WinSock Non-Blocking I/O
- 使用 winsock 接收 http 请求
- 如何查找 winsock.h 在 Visual Studio 中的包含位置
- 在Linux上交叉编译Windows应用程序时如何链接到Winsock?
- C++低吞吐量 winsock TCP 测试应用程序
- Winsock 数据不是从 IP 检索的,而是从普通 URL 检索的
- 错误:10035 Winsock发送
- 如何使用c++在winsock中从客户端向服务器发送大字符串
- 如何使用winsock在c++应用程序中实现安全套接字通信
- 如何为winsock的send()函数构造constchar*缓冲区
- C++WinSock选择本地接口进行连接
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- 使用 WinSock 处理多个用户
- Winsock本地客户服务器基准测试
- WinSock c++ inet_ntop始终显示 204.204.204.204(并且 accept() 没有失败)
- Winsock错误10022在听
- 致命错误:Winsock:没有这样的文件或目录
- 如何通过TCP/IP Winsock发送双型数据
- Winsock 400 错误请求,开放性