我正在使用Linux机器与PLC通信。 PLC和Linux机器连接在本地网络中,并使用UDP / IP作为基本协议。此外,端口号两侧都是固定。
这种沟通需要实现:
要求1 :Linux机器可以向PLC发送命令(每次一个命令)。收到每个命令后,PLC将在50ms内响应Linux机器的成功/失败消息
要求2 :反之亦然,PLC可以向Linux机器发送命令。 Linux机器必须在50ms内回复消息。 PLC发送异步到Linux机器。因此,Linux机器需要持续监视(或监听)端口。
简单的C / C ++代码已用于分别针对上述要求测试通信。有效。但是进行了阻断机制。
这是具有挑战性的部分。我想用pthreads进行这样的沟通。我的解决方案是为每个需求简单地创建两个线程。我使用附加的图片https://www.dropbox.com/s/vriyrprl7j6tntx/multi-thread%20solution.png?dl=0概述了我的想法,并使用了线程0'表示主线程,'线程1'表示要求1线程和'线程2'表示要求2线程。 '共享数据'表示可以在所有子线程中共享的数据。 '线程1数据'专用于线程1使用,其他线程将无法访问。同样,'线程2数据'仅由第2个线程使用。
考虑到两个线程将在同一端口上进行系统调用,我的担忧上升。因此,我需要对我的解决方案进行审核,获得更多有用的解决方案真是太棒了。附:我不太担心线程同步和创建。如果您的解决方案中需要线程同步和创建,那对我来说是非常酷的。
提前致谢。
答案 0 :(得分:0)
两个线程在同一个套接字上执行系统调用没有一般问题。但是,您可能会遇到一些具体问题:
如果你在两个线程中都呼叫recvfrom()
(一个等待PLC发送请求,另一个等待PLC响应来自服务器的命令),你就不会这样做。知道哪一个会收到回复。为了解决这个问题,您可以将一个线程专用于从PLC读取,并使用共享队列或类似结构将回复消息从PLC传递到发送线程。
当你关闭一个可能被另一个线程使用的套接字时你必须要小心 - 由于文件描述符被重用的方式,很容易出现一个竞争条件最终导致线程作用在错误的套接字上。