使用 QTcpSocket 的 TCP 数据包

2023-12-09

我知道 TCP 保证所有数据包都会到达。但是一个数据包可以分成2个或更多吗?我正在使用 Qt 和 QTcpSocket 类,我想知道的是ReadyRead()仅当完整数据包到达时才会发出信号。或者换句话说,以第一个字节发送数据包大小,然后循环等待直到所有字节到达是否有任何意义?或者我可以打电话socket->readAll()我必须得到一整包?


如果发送大量数据,数据包可能会分成不同的部分到达。或者,可以在一个readyRead槽中接收多条消息。

最好的做法是通过将第一个字节设置为将发送的字节数来控制这一点。然后,在readyRead中,您读取第一个字节并将数据附加到缓冲区,直到收到预期的数据量。

在接收数据时,这也意味着如果在一次调用readyRead()中接收到多条消息,您可以知道第一条消息在哪里结束,下一条消息从哪里开始。

以下是客户端在 readRead 函数中接收数据的示例()

void MyClass::readyRead()
{
    // m_pConnection is a QTcpSocket

    while(m_pConnection->bytesAvailable())
    {
        QByteArray buffer;

        int dataSize;
        m_pConnection->read((char*)&dataSize, sizeof(int));
        buffer = m_pConnection->read(dataSize);

        while(buffer.size() < dataSize) // only part of the message has been received
        {
            m_pConnection->waitForReadyRead(); // alternatively, store the buffer and wait for the next readyRead()
            buffer.append(m_pConnection->read(dataSize - buffer.size())); // append the remaining bytes of the message
        }

        QString msg(buffer); // data in this case is JSON, so we can use a QString
        emit Log(QString("\tMessage Received: %1").arg(msg));

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

使用 QTcpSocket 的 TCP 数据包 的相关文章

  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • 使用 TcpClient 通过 C# 通过 TCP 发送多个文件

    我正在尝试使用 C TcpClient 通过 TCP 发送多个文件 对于单个文件来说它效果很好 但是当我有多个文件时 它只发送第一个文件 这是我的代码 发送文件 try TcpClient tcpClient new TcpClient N
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • Jmeter TCP Sampler - 如何重用线程之间的连接?

    我在 JMeter 的 ThreadGroup 下设置了一个 TCP 采样器 数据是从 CSV 文件中选取的 第一行数据用于认证 后续行为实际参数数据 像下面这样的东西 AAAAAAA21 BBBBBBBCCCCCCCDDDDDDD BBB
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma

随机推荐

  • Ionic:如何覆盖后退按钮功能?

    我需要覆盖两个按钮的后退按钮功能 导航栏左上角的后退图标 硬件后退按钮 例如在 Android 中 但仅针对一种特定视图 而不是全局视图 我怎样才能做到这一点 有可能覆盖两个按钮的后退按钮功能从您的控制器内 这是代码 run this fu
  • 当用户在相邻单元格中输入信息时,自动填充单元格中的日期

    我有一个电子表格 人们可以在其中输入项目更新 然后输入更新日期 正在发生的事情是人们忘记在笔记上注明日期 有没有办法让日期单元格自动填充当前 输入日期 我假设 if 函数可以做到这一点 This 事件宏将把日期放在列中B如果在列中输入值A
  • 如何使用数据工厂创建 Azure 按需 HD Insight Spark 集群

    我正在尝试使用 Azure 数据工厂使用 Hdi 版本 3 5 创建按需 HD Insight Spark 集群 数据工厂拒绝创建并显示错误消息 HdiVersion 不支持 3 5 如果目前无法创建按需 HD Insight Spark
  • 右键单击 jqGrid 时禁用行选择

    在 jqGrid 中 我当前使用以下命令禁用行选择 beforeSelectRow function return false 这对于左键单击效果很好 但是 我注意到它没有触发beforeSelectRow事件处理程序 并且当我右键单击时仍
  • CKeditor保存事件

    我按照本主题中写的步骤进行操作 CKEditor AJAX 保存如果有人按下 AjaxSave 按钮 我尝试触发自定义 saved ckeditor 事件 但我没有成功 ckeditor plugins ajaxsave plugin js
  • 等待 IE 文件下载完成的 VBA 代码

    我正在尝试从网页下载 Excel 文件 到目前为止 我能够打开网页 导航并单击 保存 按钮 但下载后我需要访问该 Excel 文件 但有时下载需要时间 具体取决于文件的大小 有什么方法可以检查窗口并查看下载是否完成 然后才能继续打开下载的文
  • 如何删除 BigQuery 中属于嵌套列的列

    我想删除 BigQuery 表中属于记录或嵌套列的列 我在他们的中找到了这个命令文档 不幸的是 此命令不适用于现有 RECORD 字段内的嵌套列 有什么解决方法吗 例如 如果我有这个架构 我想删除地址字段内的 address2 字段 所以由
  • 拦截 ESC 而不从缓冲区中删除其他按键

    我有一个控制台应用程序 提示用户进行多个输入 我希望用户能够在出现任何取消操作的提示后按转义键 就像是 if Console ReadKey Key ConsoleKey Escape string input Console ReadLi
  • 时间:2019-03-17 标签:c#updatepanelwithtimerpage_load

    我现在正在尝试一些 AJAX 我有一个自定义控件出现在我的母版页上 其中有一个更新面板和一个计时器 计时器启动 面板更新 一切都很顺利 除了我不希望它在每次刷新时执行一些操作之外 似乎每次刷新都会发生整个页面生命周期 我想设置一些变量 并在
  • 指数维护

    什么是索引维护以及如何进行 我需要多久做一次 有什么好处 这与经常修改的事务表有关 所有 DML 操作都将在该表上运行 我赞同乔纳森所说的一切 除了索引维护的频率 好吧 如果您碰巧有一个设计不佳的索引 例如 GUID 键上的聚集索引 您实际
  • 将 CURDATE() 的日期值与完整时间戳字段进行比较

    我有一个函数将时间戳值 YYYY MM DD HH MM SS 放入META VALUE表的列META 我想要做的是比较日期部分 YYYY MM DD 是否META VALUE等于今天 CURDATE 忽略小时 分钟和秒 HH MM SS
  • 尝试访问 Rails 控制台时 git 远程中的多个应用程序

    我有两个 git 分支 staging and production 我将它们部署在 Heroku 上的同一个 Heroku 帐户中 假设我的应用程序名称是app1 heroku app com and app2 heroku app co
  • 如何使用 ggplot2 在 R 中添加可变大小的 y 轴标签而不更改绘图宽度?

    我有一个用 R 中的 ggplot2 制作的图 我想在 y 轴上添加水平文本标签 然而 根据文本的长度 R 会相应地压缩我的绘图以创建固定宽度的图像 但是 无论文本宽度如何 我都需要绘图具有相同的长度并且具有相同的起始位置和停止位置 边距
  • Selenium:会话外部密钥不可用

    每当 Robot Framework 自动化测试 由 Jenkins 作业启动 从 Hub 请求 Chrome 浏览器时 我正在运行的 Selenium Grid Hub 就会显示此错误消息 会话 null externalkey 不可用且
  • Selenium:是否有类似“DOM 中插入新元素”之类的事件

    我正在测试的网站有一个通知逻辑 它会在屏幕底部显示一条消息 将其保留一秒钟 然后将其发送出去 当显示通知时 它会隐藏其他元素 这使我的测试不稳定 我尽力弄清楚通知何时显示 当业务逻辑显示通知时 并忽略它 但时不时地我会检测到我的代码不知道通
  • 如何将项目添加到列表

    我的项目中有模型 这是模型代码 public partial class Logging public string Imei get set public DateTime CurDateTime get set public Nulla
  • 在 Outlook 中自动调整 VML 背景图像的大小

    我知道关于防弹电子邮件背景hack 但由于这会在背景中放置一个设定大小的 VML 矩形 然后将内容放置在其中 因此它不会调整大小 或者换句话说 表格单元格中的文本被裁剪为 VML 矩形的高度 我已经尝试了我能想到的一切 但似乎无论如何都不允
  • 创建新实体时不会自动生成相对路由

    当我使用命令 jhipster实体 entityName 创建新实体时 相对路径不会在我的 entityName route ts中自动生成 相反 在主路线的地方我有这个 而不是 实体名称 另外 所有添加 更新 删除的路由也不包含前缀 en
  • AChartEngine不显示最大图表值

    我正在尝试使用 AChartEngine 显示水平条形图 在条形图中 应显示 ChartValues 我在代码中使用 XYSeriesRenderer setDisplayChartValues true 以下是渲染的图表 正如您所看到的
  • 使用 QTcpSocket 的 TCP 数据包

    我知道 TCP 保证所有数据包都会到达 但是一个数据包可以分成2个或更多吗 我正在使用 Qt 和 QTcpSocket 类 我想知道的是ReadyRead 仅当完整数据包到达时才会发出信号 或者换句话说 以第一个字节发送数据包大小 然后循环