我正在构建一个简单的对等应用程序,其中大约8个参与者彼此连接(n*n
)。我将使用UDP,其中包含可靠性和订购协议。每个对等体每秒将广播几KB数据。
我想到有两种方法可以在每个对等体上配置端口:
每种方法有哪些优点和缺点?
答案 0 :(得分:1)
我从未对这种应用模式做过任何事情,但这是我的一些想法。
需要考虑的一件大事是,对等体之间是否有防火墙。如果是这样,每个侦听端口都需要打孔。这可以完成一次(例如路由器端口转发规则)或动态(UPnP等),但您可能无法依靠自动全锥NAT为您执行此操作。如果您希望同伴之间有任何防火墙,我建议您使用单个端口以便于编程,并严格按照其远程地址或其他协议标识符识别您的对等端。
每个用户使用一个端口可以使识别通信变得更加简单,但是如果您希望参与者数量增加n(n-1)/ 2。如果你从不期望超过一个小数目(例如20),那么每个端口的端口将在没有太多努力的情况下运行良好。
您(可能)的另一个选择可能是使用多播。如果所有同伴都在同一个广播域上,这将减少总线争用,并可能使您的编码更加清晰。
希望这会有所帮助。如果这不是您正在寻找的,我道歉。祝你好运!
答案 1 :(得分:1)
只创建一个端口与每个对等端进行通信是最佳选择。您只创建一个套接字,并且只使用一个端口来发送/接收具有所需数量的对等数据的数据。您可以通过查看每个数据包的源地址来区分接收的数据。这种方式代码更简单,资源效率更高。
创建多个端口绝对没有优势。它会使您的代码复杂化并且将使用更多资源而没有任何好处。资源消耗将随着更多同行的增长而增长。
答案 2 :(得分:1)
每个对等端占用一个端口,所有消息都通过
接收
如果每个对等体都可以获得传入数据报的源IP /源端口(我敢打赌),这足以区分对等体。
每个对等体为每个其他对等体接受一个端口,并且仅与之通信 使用相应端口的对等端
见上文,最重要的是,这首先与您的广播基本理念相矛盾。它只是增加了一定程度的复杂性(并且可能不是很具可扩展性,即使你现在只设想了8个同行)。
根据你的基本要求,我认为你可能会陷入两难境地:
这引发了一些问题,正如你已经通过提出问题所意识到的那样。
我看到其他两个问题:
还有第三种方法:
此方法用于SSDP(简单服务发现协议),UPnP的一部分。我不建议你使用SSDP,它可能会因为你想做的事而臃肿,你说你想要一些简单的东西。
总而言之,您首先必须解决您的困境:决定并区分真正需要广播的数据与单播部分。 YMMV。
PS:使用广播UDP也会出现问题,即虽然在局域网上确定,但除非您使用多播路由,否则不会通过路由器。但这是另一个故事。