在工作中,我负责将TCP服务器作为Modbus从站设备的一部分来实现。我在堆栈交换和一般的互联网上都做了大量的阅读(包括优秀的http://beej.us/guide/bgnet/),但我在设计问题上挣扎。总之,我的设备只能接受2个连接,并且每个连接都会有输入的modbus请求,我必须在主控制器循环中处理这些请求,然后回复成功或失败状态。我有如何实现这一点的以下想法。在Linux上编写多线程TCP服务器
有一个创建,结合,监听并接受连接,侦听器线程,然后产生一个新的并行线程监听传入数据和空闲超时时间后关闭连接的连接上。如果活动线程数目前为2,则立即关闭新连接以确保只允许2个连接。
不要从侦听器线程产生新的线程,而是使用select()检测传入的连接请求以及传入的modbus连接在活动连接上(类似于Beejs指南中的方法)。
- 创建2个监听器线程,每个监听器线程创建一个可以阻止accept()调用的套接字(相同的IP和端口号),然后关闭套接字fd并处理连接。在这里,我(可能天真地)认为这将只允许最多2个连接,我可以使用阻塞读取来处理。
我一直在使用C++很长一段时间,但对于Linux开发我相当陌生。对于上述哪种方法最好(如果有的话),以及如果我对Linux的经验不足意味着他们中的任何一个都是非常糟糕的想法,我都非常欢迎。我热衷于避免fork()并坚持pthreads,因为传入的modbus请求将被排队并定期从主控制器循环读取。提前感谢您的任何建议。
我喜欢这样的声音 - 唯一的问题是我的主循环严格禁止。它必须执行处理并定期处理来自监听器线程的请求。考虑到这一点,你说选项2.会是最好的? – mathematician1975
@ mathematician1975你仍然可以使用我的方法,但不是在'accept'上使用short或no-timeout'select'来阻塞(或者让侦听套接字非阻塞,并使用'accept'并检查'EAGAIN' /'EWOULDBLOCK ')知道何时可以接受连接。 –
我认为考虑到我的时间限制,这是我在短期内追求的最佳解决方案。谢谢你的建议。 – mathematician1975