在工作中,我的任务是实现 TCP 服务器作为 Modbus 从设备的一部分。我在堆栈交换和互联网上读了很多书(包括优秀的http://beej.us/guide/bgnet/ http://beej.us/guide/bgnet/)但我正在努力解决设计问题。总之,我的设备只能接受 2 个连接,并且每个连接上都会收到传入的 modbus 请求,我必须在主控制器循环中处理这些请求,然后回复成功或失败状态。对于如何实现这一点,我有以下想法。
有一个侦听器线程来创建、绑定、侦听和接受连接,然后生成一个新的 pthread 来侦听连接上的传入数据,并在空闲超时时间后关闭连接。如果当前活动线程数为 2,则立即关闭新连接以确保仅允许 2 个连接。
不要从侦听器线程中生成新线程,而是使用 select() 来检测传入连接请求以及活动连接上传入的 modbus 连接(类似于 Beejs 指南中的方法)。
- 创建 2 个侦听器线程,每个线程创建一个套接字(相同的 IP 和端口号),该套接字可以阻止accept() 调用,然后关闭套接字 fd 并处理连接。在这里,我(也许天真地)假设这最多只允许 2 个连接,我可以使用阻塞读取来处理这些连接。
我已经使用 C++ 很长时间了,但对 Linux 开发还很陌生。我非常欢迎任何关于上述哪种方法最好(如果有的话)的建议,以及我对 Linux 的缺乏经验是否意味着它们中的任何一个都是非常糟糕的想法。我热衷于避免 fork() 并坚持使用 pthreads,因为传入的 modbus 请求将排队并定期读取主控制器循环。预先感谢您的任何建议。
第三种选择不起作用,您只能绑定到本地地址一次。
我可能会使用您的第二个替代方案,除非您需要进行大量处理,在这种情况下,第一个替代方案的组合可能会很有用。
我想到的第一个替代方案的组合是让主线程(程序启动时始终拥有的线程)创建两个工作线程,然后进行阻塞accept
调用以等待新连接。当新连接到达时,告诉其中一个线程开始处理新连接并返回阻塞accept
。当第二个连接被接受时,您告诉另一个线程在该连接上工作。如果两个连接都已打开,则要么在一个连接关闭之前不接受,要么等待新连接但立即关闭它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)