我想编写一个点对点网络应用程序,遇到以下问题。
网络中的两个节点 A 和 B 正在尝试同时建立彼此的连接。当它们都接受对方的连接时,就会打开两个 TCP 套接字。
两者之间的通信应该只使用一个socket,因为双向通信就足够了。这个问题的优雅解决方案是什么?
谢谢!
最佳答案
您不应该尝试同时建立两个同时连接。这是您的 p2p 设计中的一个缺陷。两个对等点需要相互协调(例如通过中央服务器交换消息,他们都连接到并知道他们是谁)。首先需要决定谁在倾听,谁在连接。一个对等方只打开一个监听套接字,该信息将发送到另一个对等方,以便它知道在哪里连接。如果该连接失败(即,监听对等方位于 NAT/防火墙后面),则需要通知对等方并做出交换角色的决定。先前连接的对等方现在打开一个监听套接字,并将该信息发送到先前监听的对等方,以便它知道在哪里连接。如果该连接失败(即,正在监听的对等方也在 NAT/防火墙之后),则两个对等方之间的直接连接在没有额外帮助的情况下是不可能的(例如,NAT 打洞)。在某些情况下,直接连接根本不可能,因此它们之间交换的数据必须通过中央服务器进行代理。
关于sockets - 使用一个套接字进行对等通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14611169/