【问题标题】:concept feedback for a multi-client server c++多客户端服务器 C++ 的概念反馈
【发布时间】:2021-06-15 16:47:21
【问题描述】:

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

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

我的概念如下:

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.

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

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

The client sends initialization finished -> server says ok

启动以便跳过初始化。

参数请求运行如下:

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

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

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

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

非常感谢

【问题讨论】:

  • unordered_map<client_id, client_state>?

标签: c++ server tcp


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多