【问题标题】:TCP Client/Server with Linux带有 Linux 的 TCP 客户端/服务器
【发布时间】:2016-09-07 00:10:10
【问题描述】:

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

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

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

RSP => ADC 通道 X 数据

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

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

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

注意我选择 TCP/IP 是因为它会在失败时处理重绑定。在我的情况下,每个命令都有一个响应,因此如果它使设计更容易/更灵活,则可以使用 UDP。

非常感谢任何帮助。

【问题讨论】:

  • 还应该提到,命令的数量和数据包的大小会有很大的不同。所以这个系统需要在应用程序运行的整个过程中运行。可能并不总是有客户端连接。
  • 关键线程是否会保留这些数据?还是必须获取/计算它才能对请求做出反应?如果数据已经可用,那么处理客户端的线程可以只执行一个简单的读/处理/写循环,而不需要队列。 “进程”部分只会从一些线程安全的存储中访问数据。
  • 这个问题有点宽泛。如果您尝试,您将获得更高质量的答案,并写一篇关于您觉得不满意的原因的帖子。
  • @jxh 我完全同意你的看法,只是不知道从哪里开始。我想我会尝试 sashan 下面详述的选择方法,看看是否可行。如果它不符合我的需求,我会发布跟进。
  • 在 linux 上查看 epoll,它比 select 性能更高,并且在用户空间中需要更少的存储空间。我实现了a server library using epoll 并对它的性能感到满意(即使HTTP 层有一些未对齐的内存访问,它运行得非常顺利)。多线程是一个偏好和要求的问题。 RasPI 的 ARM CPU 是否具有多核或线程?我怀疑如果你坚持事件设计,单线程可能会更好。

标签: c linux multithreading sockets


【解决方案1】:

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

【讨论】:

  • 嗯,我喜欢这种方法。作为一名深度嵌入式开发人员,我从不使用线程。我不知道选择方法。如果 select 没有阻塞,这可能会起作用。我现在要重新搜索。
  • 既然 OP 引用的是 linux,我觉得epoll 可能是一个更好的选择……你觉得呢?
  • @Myst:是的,如果内核支持,epoll 就可以工作。我从来没有直接使用过 epoll,而是使用了包装 epoll 的 libevent。
  • 我将此标记为解决方案,因为它似乎确实可以根据需要工作,我也会研究 epoll。我需要看看 raspbian (jessie)(基于 debian)是否支持它。
【解决方案2】:

超经典的 linux 方法是有一个监听程序,它为每个新客户端创建一个新的副本。 Linux 甚至有一个内置的恶魔可以为你做这件事(initd - 尽管所有 systemd 的东西可能已经改变了)。这就是 sshd、telnetd、ftpd 的工作方式。没有线程

【讨论】:

  • 对不起,我应该提到只有一个客户。我的问题更多地与实际处理传入数据有关,这样它就不会因为时间紧迫的任务而干扰我的主线程。希望这是有道理的:)
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2012-01-04
  • 2013-02-17
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多