1

堆栈溢出用户!

我有一个必须处理 p2p 的应用程序,这就是我进行 UDP 打孔的方式。但我在实施时遇到了麻烦。希望你能给我一些建议。

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

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

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

方式1

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

方式2

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

这样,一个客户端绑定失败,另一个客户端监听失败,并出现WSAEADDRINUSEWSAECONNRESET错误。我显然做错了什么,您的帮助将不胜感激。提前致谢。

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

4

1 回答 1

2

如果您阅读 的文档recvfrom()它会说:

WSAECONNRESET

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

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

于 2012-12-12T22:26:43.747 回答