在工作中,我的任务是实现 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 请求将被排队并定期读取主控制器循环。提前感谢您的任何建议。