gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:50:15 27 4
gpt4 key购买 nike

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

  1. 有一个监听器线程创建、绑定(bind)、监听和接受连接,然后生成一个新的 pthread 来监听传入数据的连接,并在空闲超时期限后关闭连接。如果当前事件线程数为 2,则立即关闭新连接以确保只允许 2 个。

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

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

我已经使用 C++ 很长时间了,但我对 Linux 开发还很陌生。我真的很欢迎任何关于上述哪种方法最好(如果有的话)的建议,如果我对 Linux 的经验不足意味着它们中的任何一个都是非常糟糕的想法。我热衷于避免使用 fork() 并坚持使用 pthreads,因为传入的 modbus 请求将被排队并定期读取主 Controller 循环。在此先感谢您的任何建议。

最佳答案

第三种方法行不通,你只能绑定(bind)一次本地地址。

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

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

关于c++ - 在 Linux 上编写多线程 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com