QTcpSocket / QTcpServer 内存管理 / 服务器崩溃

2023-12-25

我正在设计和制作一个服务器,它应该能够每秒处理大约 100 次以上的点击。我从服务器获取的信息只是 HTTP 标头。根据标头中的信息,它将查询数据库(不同线程)中的某些信息,并将最终信息发送回 QTcpServer,QTcpServer 创建输出字符串,然后发回 HTTP 响应。我遇到了一个无法调试的大问题。我的代码看起来与此类似:

TCPInterface::TCPInterface(QObject *parent): QTcpServer(parent)
{
   //start listening for tcp traffic on port 80
   listen(QHostAddress::Any, 80);

   connect(this,SIGNAL(sendInfo(QTcpSocket*, QString *)), databaseThread, SLOT(recieveInfo(QTcpSocket*, QString*)));
   connect(databaseThread, SIGNAL(sendToTCPSend(QTcpSocket *, QString *)), this, SLOT(TCPSend(QTcpSocket*, QString*)));
}

`

void TCPInterface::incomingConnection(int socket)
{
   QTcpSocket *s = new QTcpSocket(this);
   connect(s, SIGNAL(readyRead()), this, SLOT(readClient()));
   //connect(s, SIGNAL(disconnected()), this, SLOT(discardClient()));

   s->setSocketDescriptor(socket);
}

`

//void TCPInterface::discardClient()
//{
   //QTcpSocket* socket = (QTcpSocket*)sender();
   //socket->deleteLater();
//}

`

void TCPInterface::readClient()
{
  QTcpSocket* socket = (QTcpSocket*)sender();

   QString header;
   while(socket->canReadLine())
   {
      header += socket->readLine();
   }

   emit sendInfo(socket, headerInfo);
}

`

void databaseThread::recieveInfo(QTcpSocket* socket, QString* headerInfo)
{
   QString*outputInfo = getDatabaseInfo(headerInfo);
   emit sendToTCPSend(socket, outputInfo);
}

`

void TCPInterface::TCPSend(QTcpSocket* socket, QString* outputInfo);
{
    QString response = "HTTP/1.0 200 Ok\r\n";
    response += "Content-Type: text/html; charset=\"utf-8\"\r\n";
    response += "\r\n" + *outputInfo + "\n";

    if(socket->isWritable() && socket->isOpen())
    {
         socket->write(response.toAscii());
    }
    //socket->disconnectFromHost();
    socket->close();
    delete headerInfo;
 }

我有一个主要问题,我知道它是什么,但找不到解决方案。

我的问题是,随着点击次数的增加,我的记忆力也在不断增加。我确信这是因为我的 QTcpSockets 永远不会被删除,因为我只是关闭它们。但是,当我不使用 close 并使用detachFromHost 和disconnected/discardClient slot/signal 时,我的服务器将因流量大而崩溃(没有消息或任何内容,所以我不确定崩溃的确切原因)。以前有人遇到过这个问题吗?任何想法都可以。


我也有同样的问题!

close() 假设是对象的解构函数。 (QT手册QTcpSocket::~QTcpSocket()) 我建议做一个实验:关闭一个套接字,然后尝试重新打开它。如果失败,则意味着套接字对象已被销毁,如果没有则意味着该对象应该被deletelat()..

在我的例子中,连接由客户端关闭,并且调用disconnect()信号并触发与discardClient()插槽相对应的方法,我在其中删除了套接字。 当我对它进行压力测试时,当我在 I5 笔记本电脑双核上同时轰击 600-800 个连接时,它通常会崩溃。平均每 5 次就会崩溃一次。

其他方面则不然。

很高兴进一步讨论。

Gil

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

QTcpSocket / QTcpServer 内存管理 / 服务器崩溃 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • BlackBerry - 如何启动消息应用程序?

    我想在我的应用程序中使用 gtalk 或任何其他信使 但我不知道如何执行此操作 您可以告诉我如何解决这个问题吗 如果您可以向我提供一些网络链接以了解有关此问题的更多信息 对于标准 BB Messenger 请尝试以下操作 int mh Co
  • C# 语言规范说明:6.2.4 显式引用转换

    正如我在this https stackoverflow com questions 53559287 c sharp foreach on ienumerableilistobject compiles but shouldnt 发布后
  • Gradle项目中IntelliJ IDEA编码问题

    通常情况下 我不会在这里提问 但我面临的问题是如此令人毛骨悚然 我无法再独自对抗 我已经筋疲力尽了 不管怎样 我将描述我所发现的一切 我发现了许多有趣的事情 我想相信这会帮助别人帮助我 软件版本 操作系统 Windows 10 Pro版本
  • 将模型保存为 H5 或 SavedModel 时出现 TensorFlow Hub 错误

    我想使用这个 TF Hub 资源 https tfhub dev google imagenet resnet v1 50 feature vector 3 https tfhub dev google imagenet resnet v1
  • iOS 13 TLS 问题

    我已经安装了 iOS 13 beta 版本并运行了包含大量网络请求的框架 但出现了以下错误 2019 09 19 15 01 33 566811 0200 395 25439 Connection 4 default TLS Trust e
  • 展平 PHP 数组

    假设我有一个包含这些字段的表单 并且无法重命名它们
  • 如何使用 iTextSharp 设置 PDF 段落的字体?

    尝试效仿这个例子here https web archive org web 20211020001758 https www 4guysfromrolla com articles 030911 1 aspx 我添加了以下代码来创建 PD
  • Laravel + Inertia SSR 如何更改默认端口?错误:监听 EADDRINUSE:地址已在使用中 :::13714

    所以我有一个生产站点和一个暂存站点 两者都在 Laravel 上 并使用服务器端渲染 SSR Node js 服务器是 Ubuntu 22 04 1 LTS 我使用 PM2 作为 Node js 的生产流程管理器 当我跑步时pm2 star
  • 手动触发 jQuery 自动完成

    我将 jQuery UI 自动完成与一些 AJAX 结合使用 直到停止输入后才会提取数据 我想做到这样 一旦找到数据 自动完成就会作为搜索结果弹出 但是 只有当我再次开始输入时 这才有效 下拉列表在我输入之前不会触发 因为直到我停止输入后它
  • 除了在Java中获取屏幕尺寸之外,还可以使用其他方式设置全屏

    我想知道是否有一种方法比使用更好Toolkit getDefaultToolkit getScreenSize getHeight getWidth 然后使用它作为 JFrame 的尺寸 然后将 JFrame 设置为undecorated
  • 使用 PHP 脚本转发电子邮件

    我们有一个 cron 的 PHP 脚本 每十分钟检查一次收件箱 该脚本的目的是处理我们提供的短信通知服务的 停止退出 功能 如果脚本发现任何电子邮件开头带有 STOP 一词的电子邮件 我们会从通知数据库中删除该用户 为了覆盖我们的基地 我们
  • 将字符串列表转换为由分隔符分隔的字符串

    将字符串列表转换为字符串的最佳方法是什么 其中值以逗号分隔 String Join myListOfStrings ToArray
  • Java中判断一个字符串是否为整数[重复]

    这个问题在这里已经有答案了 我试图确定字符串数组中的特定项目是否是整数 I am split 中的中缀表达式String形式 然后尝试将结果数组拆分为两个数组 一种用于整数 一种用于运算符 同时丢弃括号和其他杂项 实现这一目标的最佳方法是什
  • WPF ListView 的资源管理器主题?

    如何在 WPF ListView 中获取资源管理器主题 我知道一个答案是 GridView 但这就像Details在 Windows 资源管理器中查看 我需要列表 图块和图标查看主题如资源管理器 我怎样才能得到它 The Windows A
  • 跟踪 Rails 中 ActiveRecord 对象中非持久属性的脏信息

    我有一个继承自 ActiveRecord 的对象 但它有一个未保留在数据库中的属性 例如 class Foo lt ActiveRecord Base attr accessor bar end 我希望能够使用 ActiveModel Di
  • GAC 正在进行编辑流程吗?

    每次我对库类进行编辑时 我都会对其进行编译以获得更新的 DLL 但是为了对使用该库的项目进行有效编辑 我必须执行以下命令 gacutil I
  • 如何使用 Python 通过 XMPP 传输文件?

    我在用着xmpppy http xmpppy sourceforge net 我的 jabber 远程管理机器人的库 但我找不到如何发送 接收文件并将其保存在指定的目录中 文档很差 也没有任何示例 但我真的很想制作它 任何人都可以展示一些示
  • 将自定义表单元素添加到 Adminhtml 表单

    有没有办法将自定义表单元素添加到 Magento Adminhtml 表单中 而不将自定义元素放置在lib Varian folder 我已经找到了本质上是一个的代码Varian Data Form Element factory publ
  • 如何等待Spark服务停止?

    对于我的 Spark API 我正在构建集成测试 有时我想停止并启动 Spark 实例 当我这样做时 有时会遇到这样的问题 我正在创建一个新的 Spark 实例 而旧的实例仍在单独的线程上关闭 了解 Spark 实例何时实际关闭会很有帮助
  • QTcpSocket / QTcpServer 内存管理 / 服务器崩溃

    我正在设计和制作一个服务器 它应该能够每秒处理大约 100 次以上的点击 我从服务器获取的信息只是 HTTP 标头 根据标头中的信息 它将查询数据库 不同线程 中的某些信息 并将最终信息发送回 QTcpServer QTcpServer 创