问题标签 [qtcpsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
907 浏览

qt - QTcpSocket 从服务器接收数据

是否可以从 QTcpSocket 读取未知形式的数据?

我的意思是,我有一个 TCP 客户端和服务器应用程序。两者都使用 QDataStream 成功交换数据包。

如果说任何其他应用程序(不是我创建的)通过相同的 IP 和端口向我的服务器发送数据,是否可以读取数据?

我知道除非它是使用 QDataStream 编写的,否则将无法读取它,但是如何转储接收数据以便我可以更改我的代码以接受这种形式的数据?

所以,最后我的问题是,使用 QTcpSocket 的服务器/客户端应用程序如何从未知的客户端/服务器应用程序读取(转储)数据?

希望我没有混淆任何人。

0 投票
2 回答
264 浏览

qt - 使用 QTcpSocket 传输文件时出现奇怪的字符

我正在尝试使用 QTcpSocket 传输文件。连接运行良好,但我的问题是当我尝试在文件中记录接收到的字节时。当我打开文件时,文件开头有一些奇怪的字符。这些字符是什么?

0 投票
1 回答
346 浏览

qt - TCP 套接字通信被破坏

我正在尝试使用 TCP 服务器并使用 QTcpSocket 客户端连接到它。大多数时候,服务器和客户端碰巧在同一台机器上,但这不是必需的。我想要做的是将文件从正在运行的多线程进程传输到想要共享服务器和客户端使用的信息的 GUI。

连接等似乎很好。事实上,这段代码似乎在很长一段时间内都能完美运行,但现在我在不同的硬件上运行它,在 Ubuntu 12.04 而不是 10.04 上,我偶尔会在收到的代码中嵌入杂散字节——通常(但不是总是)空值。我无法弄清楚出了什么问题,并欢迎任何建议。

这是读取我的文件并将字节发送到连接的客户端的服务器部分:

这是我读取正在发送的数据的地方。这是连接到 readyRead 信号的插槽

0 投票
6 回答
25311 浏览

c++ - 如何确保不会错过来自 QTcpSocket 的 readyRead() 信号?

QTcpSocket用于接收数据时,使用的信号是readyRead(),表示有新数据可用。但是,当您在相应的插槽实现中读取数据时,不会readyRead()发出额外的数据。这可能是有道理的,因为您已经在函数中,您正在读取所有可用数据。

问题描述

但是,假设此插槽的以下实现:

如果一些数据在调用之后readAll()但在离开插槽之前到达怎么办?如果这是其他应用程序发送的最后一个数据包(或者至少是一段时间内的最后一个)怎么办?不会发出额外的信号,因此您必须确保自己读取所有数据。

最小化问题的一种方法(但不能完全避免)

当然我们可以这样修改slot:

但是,我们还没有解决问题。数据仍然有可能在socket->bytesAvailable()-check 之后到达(甚至将/另一个检查放在函数的绝对末尾也不能解决这个问题)。

确保能够重现问题

由于这个问题当然很少发生,所以我坚持第一个实现插槽,我什至会添加一个人为的超时,以确保问题发生:

然后我让另一个应用程序发送 100,000 字节的数据。这就是发生的事情:

新连接!
32768(或 16K 或 48K)

消息的第一部分被读取,但结尾不再被读取,因为readyRead()不会再被调用。

我的问题是:确定这个问题永远不会发生的最好方法是什么?

可能的解决方案

我想出的一个解决方案是在最后再次调用同一个插槽,并在插槽的开头检查是否还有更多数据要读取:

由于我不直接调用插槽,而是使用QTimer::singleShot(),因此我假设QTcpSocket无法知道我正在再次调用插槽,因此readyRead()不会再发生未发出的问题。

我包含该参数的原因是不允许bool selfCall被调用的插槽更快退出,否则可能会再次出现相同的问题,即数据恰好在错误的时刻到达并且没有发出。QTcpSocketreadyRead()

这真的是解决我的问题的最佳解决方案吗?这个问题的存在是 Qt 中的设计错误还是我遗漏了什么?

0 投票
0 回答
612 浏览

c++ - 两种方式 QTcpSocket 文件传输问题

我对此有点困惑,并且没有很多文件传输经验,所以希望我只是在做一些愚蠢的事情。

反正。问题。我正在将一个文件从我的客户端分块发送到我的服务器。这工作正常。在发送期间,我的客户正在定期等待进度消息,所以我知道已经发送了多少数据。但是,当我发送任何进度消息时,服务器端的文件传输超时。

我很确定这不是客户端代码的问题,所以我会忽略它。我已经评论了在 sendFeedback() 方法中似乎杀死东西的两行。使用注释掉的两行,waitforReadyRead() 将几乎立即在主循环中超时。这几乎就像写出套接字会阻止读取套接字上的任何信息并阻止读取任何进一步的数据。

感觉就像我在“同时”发送和接收时丢失了套接字的东西,但我在文档中找不到任何东西。

任何想法将不胜感激。

文件接收代码:

这是我的反馈功能:

0 投票
1 回答
885 浏览

c++ - Qt的QTcpSocket ReadyRead信号的实现

我想知道 Qt 对QTcpSocket'ReadyRead信号的实现。它是如何在 Windows 和 Linux 上实现的?使用select(), poll(),epoll()SIGIO任何其他方式?如何QTcpSocket知道何时发出ReadyRead信号?

0 投票
2 回答
822 浏览

c++ - QTcpSocket:发送大文件时有多个ReadyReads

我想使用 QTcpSocket 以 200KB/秒(5 秒的传输)发送一个 1MB 的文件。ReadyRead 插槽函数首先读取文件大小(标头),然后启动一个线程,该线程在从套接字读取 file_size 字节时阻塞。但是,由于 readyRead 插槽函数在文件传输之前结束,不会有对 readyRead 函数的新调用(新的 ReadyReads 发出)会干扰吗?

我在这里读到:如何确保不会错过来自 QTcpSocket 的 readyRead() 信号?当你在 slot 函数中时,不会发出新的 ReadyReads。

0 投票
1 回答
8929 浏览

qt - QSocketNotifier:不能从另一个线程禁用套接字通知器

我知道我无法在线程之间与 QTcpSocket 通信,但我找不到我做错了什么。

一旦我向另一个线程中的 QTcpSocket 发送数据发射信号,QSocketNotifier 应该禁用自身以让 QTcpSocket 读取数据。因为我遇到了上述错误,所以它不会被禁用,并且不会发出 readyRead() 信号。

我使用 QEventLoop 来实现阻塞机制(同步通信 - ModBus 协议)而不锁定主循环。我不能使用 waitReadyRead() 因为我在过去遇到过该函数的问题(超时):

https://bugreports.qt-project.org/browse/QTBUG-24451

https://bugreports.qt-project.org/browse/QTBUG-14975

有人可能会好奇为什么我设置了这么多线程:

Thread1:每个新的通信都会创建一个新线程,并用“全局”互斥锁将其锁定,以确保没有其他函数会执行并行通信。在该线程内 - 在准备和锁定互斥锁之后,我通过 Thread2 中的 Qt::QueuedConnection 信号与 QTcpSocket 通信(与设备的持续通信)。

Thread2:创建并移动到线程的 QTcpSocket 对象。连接设备后,我不想关闭套接字。因为我阻塞了主事件循环,所以我需要其他事件循环来运行来自 QTcpSocket 的信号。

和代码:

所以正如我所说,插槽 TcpSocketClient::readyRead() 不会被调用,并且我在输出时收到消息:“QSocketNotifier:不能从另一个线程禁用套接字通知器”。

如果我替换此代码:

和:

所以程序没有被推送到线程,而是在主线程中运行(唯一的区别!)然后一切正常 - readyRead 插槽工作循环中断,我得到数据。我需要将 ModbusCommandReply 作为线程运行,因为我在 mcr->execute 中设置了 mutex.lock(),因此每当我的程序的其他部分运行方法 execModbusCommand 时,它将停止,直到其他线程释放资源来建立通信。

我不明白为什么它说“QSocketNotifier:不能从另一个线程禁用套接字通知器” - 我在线程启动后通过将新对象放在堆上来在 THREAD_2 内设置 QTcpSocket: tcpSocket_ = new QTcpSocket(this);

我将不胜感激任何帮助,谢谢!

0 投票
3 回答
2249 浏览

c++ - 为什么我的代码无法读取 QTcpSocket 上可用的字节数?想法?

我在循环体中有以下代码片段,负责从 QTcpSocket 读取数据(nntp 是指向 QTcpSocket 的指针)。

间歇性地,这会输出类似于以下内容的内容:

我从那里的代码行为不端。这对我来说似乎很奇怪,并且表明我完全误解了 QTcpSockets 的工作原理。当然,如果 bytesAvailable > 0 那么后续读取将意味着可以将 bytesAvailable 字节读入缓冲区,在这种情况下 bytesRead 应该 == bytesAvailable。还是我错过了什么?我目前的怀疑是它可能是某种内存损坏..

编辑:抛出一些 nntp.errorString() 消息报告在此失败期间,“网络操作超时”。我需要调查这意味着什么......(想法?)

编辑2:似乎“网络操作超时”只是意味着读取超时。当代码正常工作时(即间歇性地),我仍然会收到这个“错误”。

编辑 3:上述代码片段的完整算法上下文可以在这个 pastebin 链接中找到。

编辑 4:编辑 3 中的函数版本略有不同,但仍然存在相同的问题,在这个较新的 pastebin 链接上

0 投票
1 回答
196 浏览

c++ - 如何强制 QTcpServer 监听特定端口?

是否可以强制 QTcpServer 监听小于 1024 的特定端口?