【发布时间】:2012-06-15 03:41:36
【问题描述】:
在工作中,我的任务是实现 TCP 服务器作为 Modbus 从设备的一部分。我在堆栈交换和一般互联网(包括优秀的http://beej.us/guide/bgnet/)上都做了很多阅读,但我正在努力解决设计问题。总之,我的设备只能接受 2 个连接,并且每个连接上都会传入 modbus 请求,我必须在主控制器循环中处理这些请求,然后回复成功或失败状态。关于如何实现这一点,我有以下想法。
有一个侦听器线程来创建、绑定、侦听和接受连接,然后生成一个新的 pthread 来侦听连接上的传入数据并在空闲超时时间后关闭连接。如果当前活动线程数为 2,则立即关闭新连接以确保只允许 2 个。
-
不要从侦听器线程生成新线程,而是使用 select() 来检测传入的连接请求以及活动连接上的传入 modbus 连接(类似于 Beejs 指南中的方法)。
- 创建 2 个侦听器线程,每个线程创建一个套接字(相同的 IP 和端口号),它可以阻塞 accept() 调用,然后关闭套接字 fd 并处理连接。在这里,我(也许天真地)假设这将只允许最多 2 个连接,我可以使用阻塞读取来处理这些连接。
我已经使用 C++ 很长时间了,但我对 Linux 开发还很陌生。我真的很欢迎关于上述哪种方法最好(如果有的话)的任何建议,以及我对 Linux 的缺乏经验是否意味着它们中的任何一种都是非常糟糕的想法。我热衷于避免 fork() 并坚持使用 pthread,因为传入的 modbus 请求将被排队并定期读取主控制器循环。提前感谢您的任何建议。
【问题讨论】:
标签: c++ linux multithreading sockets pthreads