在Linux上编写多线程TCP服务器

mat*_*975 6 c++ sockets linux multithreading pthreads

在工作中,我的任务是将TCP服务器作为Modbus从设备的一部分来实现.我已经在堆栈交换和一般的互联网上做了很多阅读(包括优秀的http://beej.us/guide/bgnet/),但我正在努力解决设计问题.总之,我的设备只能接受2个连接,并且在每个连接上都是传入的modbus请求,我必须在主控制器循环中处理这些请求,然后回复成功或失败状态.我有如何实现这一点的以下想法.

  1. 有一个创建,绑定,侦听和接受连接的侦听器线程,然后生成一个新的pthread来监听连接以获取传入数据并在空闲超时期限后关闭连接.如果活动线程的数量当前为2,则立即关闭新连接以确保仅允许2个.

  2. 不要从侦听器线程生成新线程,而是使用select()来检测传入的连接请求以及活动连接上的传入modbus连接(类似于Beejs指南中的方法).

  3. 创建2个侦听器线程,每个线程创建一个套接字(相同的IP和端口号),可以阻止accept()调用,然后关闭套接字fd并处理连接.在这里,我(或许天真)假设这将只允许最多2个连接,我可以使用阻塞读取来处理.

我一直在使用C++,但我对Linux开发还不熟悉.我真的很欢迎任何关于上述哪种方法最好的建议(如果有的话)以及我对Linux的经验不足意味着他们中的任何一个都是非常糟糕的想法.我希望避免fork()并坚持使用pthreads,因为传入的modbus请求将被排队并定期从主控制器循环读取.提前感谢任何建议.

Som*_*ude 3

第三种选择不起作用,您只能绑定到本地地址一次。

我可能会使用您的第二个替代方案,除非您需要进行大量处理,在这种情况下,第一个替代方案的组合可能会很有用。

我想到的第一个替代方案的组合是让主线程(程序启动时始终拥有的线程)创建两个工作线程,然后进行阻塞调用accept以等待新连接。当新连接到达时,告诉其中一个线程开始处理新连接并返回到阻塞accept。当第二个连接被接受时,您告诉另一个线程在该连接上工作。如果两个连接都已打开,则要么在一个连接关闭之前不接受,要么等待新连接但立即关闭它们。