如果两个服务器都可以启动连接,如何在两个服务器之间建立TCP连接?

时间:2010-03-17 08:07:41

标签: tcp

我有一定数量的服务器可以用自己的方式在本地处理数据。但是过了一段时间我想要同步每个服务器上常见的一些状态。我的想法是建立从每个服务器到其他服务器(如网状网络)的TCP连接。

我的问题是我以什么顺序建立连接,因为这里没有“主”服务器,因此每个服务器都负责创建自己与每个服务器的连接。

我的想法是让每个服务器连接,如果连接的服务器已经连接到连接服务器,那么只需断开连接即可。

但是,如何处理2台服务器同时尝试连接的事实?因为那时我得到2个TCP连接而不是1.

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

就像一个想法。每个服务器接受一个连接,然后发现它在同一服务器之间有两个TCP连接。然后选择一个连接关闭。选择要关闭的连接的方法只需要实现。例如,两个服务器应该比较它们的名称(或它们的IP地址或它们的UID)和由名称小于(或UID)的服务器发起的连接应该被关闭。

答案 1 :(得分:1)

当您连接到服务器时,您将需要一个握手协议,这样您就可以验证是否可以开始发送/接收数据,否则您可能最终只能连接其中一个端点并立即开始发送数据让另一端放弃连接。

为了确保只有一个连接到服务器,你只需要像这样的伪代码:

remote_server = accept_connection()
lock mutex;
if(already_connected(remote_server)) {
  drop_connection(remote_server)
}
unlock mutex;

如果您的服务器不是多线程的,那么当您检查是否已经连接时,您不需要任何锁定来保护您 - 因为不会有“同时”问题。

如果远程服务器关闭了您刚刚设置的连接,则还需要基于小的随机宽限期连接到服务器的重试机制。

如果连接已关闭,请等待一段时间,检查您是否已连接(可能另一端同时建立了与您的连接)并尝试再次连接。这是为了避免由于上述逻辑而两端同时建立连接但另一端关闭它的情况。

答案 2 :(得分:0)

虽然更好的解决方案意味着制作一个单独的“LoadBalancer”,所有服务器都连接到这里,这是一个小建议,以确保不会同时创建连接。

您的服务器可以使用

在不同时间启动连接
  

bool CreateConnection =(time()%i == 0)

     

if(CreateConnection){...}

其中i是特定服务器的ID。 和time()可以是几秒或几分之一秒,具体取决于您的重新处理。

这将保证您永远不会让两台服务器同时相互连接。如果您没有服务器的ID,则可以使用随机值。