通过在 2 台服务器之间相互发送套接字来共享套接字 (WINSOCK)

Sharing sockets (WINSOCK) by sending them to each other between 2 servers

本文关键字:套接字 共享 WINSOCK 服务器 之间      更新时间:2023-10-16

我正在尝试编写一个分布式服务器系统(现在由服务器 1="main"和服务器 2="替换"组成)。不要介意一些肮脏的方法,它只是为了实现分布式服务器可以实现的基本功能。

目前,我在同一台机器上通过SO_REUSEADDR和TCP套接字运行两个服务器(也许UDP可以解决我的问题,但我想先用TCP尝试任何一种方式)。

主服务器发送与替换服务器和连接到它的客户端建立连接。现在我想要实现的是:主服务器应该将连接客户端的套接字发送到替换服务器,因此如果主服务器无法再工作(超时或其他什么),替换服务器可以与客户端一起工作并发送/接收它们。我从主服务器发送到替换服务器的套接字是我ClientSocket = ::accept(ListenSocket, NULL, NULL);得到的套接字,其中 ClientSocket 是SOCKET (UINT_PTR)。

替换服务器无法向客户端发送/接收,即使主服务器中途终止也是如此。这是因为每个服务器,即使它们在同一端口上运行,也需要通过客户端的::connect连接?

编辑:如果我的理论是正确的,这也应该通过使用UDP而不是TCP来解决,不是吗?

EDIT2:对于分布式服务器,我的意思是服务器,如果发生故障,它将被另一台服务器替换,而不会中断客户端任务。

编辑3:如果有更好,更简单的方法可以做到这一点,我也想知道。到目前为止,我不太喜欢套接字和服务器通信,这就是我想出解决它的想法的方式。

不能在计算机之间发送套接字。套接字是一个操作系统概念。它表示(在本例中)服务器和客户端之间的连接。无法在具有不同 IP 地址的其他计算机上恢复此连接,因为 TCP 连接定义为在一对地址和一对端口之间建立。

一台机器上的UINT_PTR对另一台机器没有任何意义。这是一个不透明的值。它是一个操作系统句柄。

UDP 不能解决问题,因为客户端需要注意到正在与之通信的 IP 地址已更改。

即使您管理它,您也会遇到服务器故障会杀死该服务器上所有数据的问题。另一台服务器无法使用完全相同的数据恢复。这是分布式计算的一个基本问题。您无法使所有三台计算机的状态完全同步。

通过重试使客户端容忍中断。使服务器无状态,并将所有数据放入数据库中。

这是一个很难解决的问题。寻求现成的解决方案。