使用一个套接字进行点对点通信

5
我想编写一个点对点网络应用程序,但遇到了以下问题。
网络中的两个节点A和B同时试图建立彼此之间的连接。当它们都接受对方的连接时,将会开启两个TCP套接字。
只需使用一个套接字进行双向通信即可,因为这已足以实现双向通信。有没有一种优雅的解决方案?
谢谢!
1个回答

8
你不应该尝试同时建立两个连接,这是你p2p设计的缺陷。两个节点需要相互协调(例如通过一个中央服务器交换消息,他们都连接到它并知道彼此的身份)。首先需要决定谁在监听,谁在连接。其中一个节点只需打开一个监听套接字,并将此信息发送给另一个节点,以便后者知道在哪里连接。如果连接失败(即监听节点在NAT /防火墙后面),则需要通知对等方并决定交换角色。之前连接的节点现在打开一个监听套接字,并将此信息发送给之前的监听节点,以便后者知道在哪里连接。如果连接失败(即现在的监听节点也在NAT /防火墙后面),则无法在两个节点之间建立直接连接,除非有其他帮助(例如NAT洞穿)。在某些情况下,简单地建立直接连接是不可能的,因此在它们之间交换的数据必须通过中央服务器进行代理。

1
非常感谢。我以为我可以使用更简单的方法。让一个中央服务器在两者之间进行“调解”将需要另一种协议,这意味着需要更多的开发工作和引入更多的复杂性。然而,我认为这是最好的方式。谢谢。 - AlexLiesenfeld
我所知道的大多数p2p协议都是按照我概述的方式工作的。两个对等方都连接到一个共享服务器,该服务器跟踪它们的连接信息,然后对等方请求该信息并让服务器根据需要协调直接连接。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接