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

2023-12-24

在工作中,我的任务是实现 TCP 服务器作为 Modbus 从设备的一部分。我在堆栈交换和互联网上读了很多书(包括优秀的http://beej.us/guide/bgnet/ 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 请求将排队并定期读取主控制器循环。预先感谢您的任何建议。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Linux上编写多线程TCP服务器 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 如何在 SwiftUI 应用程序中记录 Firebase Analytics 屏幕名称?

    我正在尝试在我的应用程序中记录屏幕名称 但大约 95 的屏幕名称未在 Firebase Analytics 中设置 In onAppear为了我的观点Analytics setScreenName screenName screenClas
  • windows下如何删除回收站中的文件? Python

    我正在尝试使用 python 删除回收站中的文件 但我找不到方法 谢谢 对于 Windows 操作系统 您可以使用winshell https github com tjguk winshell模块和它的empty https winshe
  • 有没有办法在 MySQL / Rails 中强制区分大小写以进行单个查找?

    我正在搜索一些标签 有些用户喜欢 猫 而另一些用户喜欢 猫 想想看 无论如何 有没有办法强制特定的查找区分大小写 例如 Tag find some special option here 有任何想法吗 您还可以在不更改列属性的情况下执行区分
  • C语言从文件中删除一行

    我想删除文件中的某些行 并根据行的某些部分是否与指定的字符串匹配来在同一文件中插入某些行 有没有一种方法可以在不使用临时文件将内容复制到等等的情况下执行此操作 问题是 文件 本质上 是磁盘上的字节数组 或任何其他物理基底 但是 无论如何 字
  • 列导向垫台

    我遇到的情况是 从后端收到的数据是面向列的 该数据的示例如下 columnName ID cells 1 2 3 4 5 columnName Name cells a b c d e 到目前为止 我已经成功地配置了我的 mat table
  • 如何在 Django Rest Framework 中创建 Json Web 令牌以供用户登录?

    我想将 JWT 集成到我的用户登录 API 中以进行身份 验证 如何将它与我在下面添加的现有代码集成 在代码中 我添加了一个需要相应更改的虚拟令牌 谢谢 添加我的 django 项目中的一些相关代码部分以供参考 序列化器 class Use
  • Boost.Asio SSL 上下文不验证证书

    这是我之前问题的延续 Boost Asio SSL上下文load verify paths未加载证书 https stackoverflow com questions 40198728 boost asio ssl context loa
  • 如何从 android 将参数传递到 HTML 文件

    我可以在 android webview 中很好地显示 HTML 文件内容 现在我如何将参数传递到 HTML 文件中 例如 我的 HTML 内容有一个视频播放器 我需要将动态值 URL 传递到 HTML 文件中以播放动态视频 我的 HTML
  • 设置带有“free”刻度的分类轴标签 ggplot2

    我正在尝试使用 R 3 1 1 中的 ggplot2 包 1 0 1 和 scales free 在分面图中的分类轴上设置标签 如果我在没有手动设置轴刻度标签的情况下进行绘图 它们会正确显示 第一个图 但是当我尝试设置标签 第二个图 时 两
  • Spring Cloud Stream Kafka Streams Binder KafkaException:无法启动流:“监听器”不能为空

    我是 Kafka Streams 和 Spring Cloud Stream 的新手 但在将集成相关代码移至属性文件中方面阅读过有关它的好文章 以便开发人员可以主要关注事物的业务逻辑方面 这里我有我的简单应用程序类 package com
  • 从插件模块读取 dll.config (不是 app.config!)

    我正在编写一个 C NET 2 0 dll 它是一个插件更大的应用 https en wikipedia org wiki AutoCAD 我的模块的 Visual Studio 项目有一个 app config 文件 该文件与 MyPro
  • 在 unix/linux shell 中进行模式匹配时如何使用反通配符或负通配符?

    假设我想复制目录的内容 不包括名称中包含 音乐 一词的文件和文件夹 cp exclude matches Music target directory 应该用什么来代替 exclude matches 来实现此目的 在 Bash 中 您可以
  • git 嵌套存储库 - 子模块、符号链接、其他

    我正在尝试使用 git 设置我的 Zend Framework 开发环境 或更重要的是我的目录结构 然而 我的根本问题实际上与所涉及的特定库无关 但更重要的是如何让 git 完成我想要的事情 我的项目根目录是 home jsuggs pro
  • 如何在应用 后获取 BitmapImage 字节

    这个 BitmapSource originalImage byte originalPixels originalPixels new byte int originalImage Width int originalImage Heig
  • 在python中通过xml.etree.ElementTree生成的xml文件中插入换行符

    我在 python 中使用 xml etree ElementTree 创建了一个 xml 文件 然后我用 tree write filename UTF 8 将文档写出到文件中 但是当我使用文本编辑器打开文件名时 标签之间没有换行符 一切
  • 经纬度转为时区

    有谁知道是否有任何现有的解决方案可以从一个点 经度 纬度 确定时区 我可以对这个项目所需的一些内容进行硬编码 但最好使用预先构建的解决方案 thanks 使用 Web 服务 例如由geonames http www geonames org
  • 在 RowSort 操作后执行操作

    我有一个JTable and a TableRowSorter我想在排序完成后执行操作 我一直在浏览网络 但到目前为止我还没有什么运气 最初我以为只是一个RowSorterListener可以解决这个问题 但不幸的是它在排序完成后不会执行该
  • 在 JAVA 中验证 JSON 字符串对象格式的最佳方法是什么

    我想验证字符串对象是否是有效的 json 对象 无论其数据正确性如何 换句话说 这个 json 字符串的格式正确吗 例如 我得到 abc 123 cba 233 该过程应返回格式异常 abc 123 cba 233 应该给予相同的 您可能认
  • MSIL检查

    我有一些字节格式的 MSIL 反射的 GetMethodBody 的结果 我想对其进行一些分析 我想在 MSIL 中找到使用 new 运算符创建的所有类 关于如何以编程方式做到这一点有什么想法吗 我最终在这里使用了 MSIL 解析器 htt
  • 在Linux上编写多线程TCP服务器

    在工作中 我的任务是实现 TCP 服务器作为 Modbus 从设备的一部分 我在堆栈交换和互联网上读了很多书 包括优秀的http beej us guide bgnet http beej us guide bgnet 但我正在努力解决设计