gpt4 book ai didi

c - Linux 下的 TCP 客户端/服务器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:34 25 4
gpt4 key购买 nike

这可能是一个非常基本的问题/设计,但我正在努力寻找正确的方法来处理我将在此处定义的系统。

我有一个带有单个客户端 (PC) 的系统,它将通过 TCP/IP 协议(protocol)连接到嵌入式 Linux 板 (Raspberry Pi)。这将是一个命令/响应系统,其中 PC 将请求某些内容,而 raspberry PI 将响应结果。

例如:
CMD => 读取/返回 ADC channel X

RSP => ADC channel X 数据

对于这种类型的系统,我已经定义了一个允许这种交互的数据包协议(protocol)。我的问题是如何在 Raspberry PI 上处理这个问题。我设想有一个线程处理 TCP 连接;将传入数据放入线程安全队列并从线程安全队列中提取传出数据。然后主线程会定期轮询队列以查找数据。当找到数据时,将处理命令并生成响应。所有命令都有响应。

主线程还将执行其他时间关键任务(PID 控制循环),因此它不能等待传入或传出数据。

我的猜测是这种类型的系统相当普遍,并且可能有一种很好的方法来实现这种类型的系统。我是 Linux 编程的新手,但我一直在编写高度嵌入式系统(无操作系统)。只是在为这种类型的设计寻找正确的方法。

请注意,我选择 TCP/IP 是因为它会在出现故障时处理重新连接。在我的例子中,每个命令都有一个响应,因此如果 UDP 使设计更容易/更灵活,则可以使用它。

非常感谢任何帮助。

最佳答案

如果可以的话,我倾向于避免使用线程,并且只在必须时才使用它们,因为它们会使程序调试变得更加困难。他们将确定性问题转变为非确定性问题。所以我最初的方法是看看我是否可以在没有线程的情况下做到这一点并且仍然实现并发。这可以使用 select 来实现,它会在套接字上有需要读取的内容时通知您的主程序。然后,当套接字上有东西时,它可以读取数据,处理它,并等待下一个事件。这种方法的问题是,如果对接收到的数据进行计算所花的时间比处理下一个数据元素所需的可接受时间长,则最终可能会在套接字上积压未处理的数据。如果发生这种情况,那么您可以继续在线程中运行接收循环,在另一个线程中运行工作函数,或者 fork 一个新进程并处理来自新进程的数据副本。

关于c - Linux 下的 TCP 客户端/服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39359519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com