多客户端服务器 C++ 的概念反馈

时间:2021-03-18 09:45:26

标签: c++ server tcp

我目前正在编写一个服务器应用程序,它应该指导多个客户端。 我不确定我设计的概念,并希望收到有关它的反馈。

有几个相同的客户端记录和处理传感器数据。此外,结果将发送到服务器,以便服务器在必要时做出反应并向客户端发送新参数。 客户端应该在连接结束后继续工作,同时尝试重新连接。如果没有连接,则无需后续传输数据。

我的概念如下:

The client logs on to the server.
The client requests an initialization -> server ok.
The client requests parameter A -> server sends parameter
The client requests parameter B -> server sends parameter
...
The client requests parameter Z -> server sends parameter
The client sends initialization finished -> server says ok

endless loop
    Server queries measured value X -> client sends measured value
    Server sends parameter Y -> client says ok.

所以首先客户端是 master 并询问它需要的初始化参数,然后服务器和客户端交换角色,服务器成为 master。

如果连接中断,客户端应该重新连接到服务器。但随后会使用以下命令:

The client sends initialization finished -> server says ok

start 以便跳过初始化。

参数请求运行如下:

Infinite loop
    Send (command)
    Timout = 1 second
        Receive
    if (! Timout)
        break

所以我发送命令并稍等,如果没有回答,我再次发送命令。此处以缩写形式显示。我用 C++ 写的,我使用了几个状态机。状态机自然也会在连接中断时捕获错误并跳回到初始化状态......

由于这是一个多客户端应用程序,我觉得有点困难。它作为单个客户端运行。我有一个类客户端,其中存储了一个状态机和一个套接字。该实例在单独的线程中运行。 我现在的问题是,如果连接丢失,我如何建立到其实例(状态机)的新连接(从旧客户端)。我会通过一些 id 比较来做到这一点。以便客户端首先发送他的 id。 (也许还有mac地址???)

我目前始终保持与所有客户端的连接。这是最先进的吗?还是应该发送命令,等待回答并再次关闭连接,然后在必要时重新连接?

非常感谢

1 个答案:

答案 0 :(得分:0)

一旦TCP连接建立 每一方都可以发送数据。 只是你必须得到正确的写入-> 读取顺序。 这可以使用非阻塞套接字 IO 轻松实现。

<块引用>

“我现在的问题是,如果连接丢失,我如何建立一个 新连接(从旧客户端)到它的实例(状态机)。一世 会通过一些 id 比较来做到这一点。以便客户发送他的 id 首先。 (也许还有mac地址???)”

一种解决方案是每个客户端都有一个 UUID,客户端每次连接它的 ID 时都必须告诉服务器,服务器可以保留 UUID 与客户端套接字连接的映射。

如果客户端丢失,服务器可以删除映射。服务器和客户端都可以检测到丢失的连接,这应该不是问题。