问题标签 [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 回答
641 浏览

c++ - 使用 QTcpSocket 传输大文件时出现“内存已满”

bytesWritten我正在尝试通过连接到我的函数以非阻塞方式传输大文件sendNextBlock

我在 Symbian 手机上运行此代码,在传输了 5-6 兆字节后,手机中出现“内存已满”消息框,调试输出中显示以下消息:

我认为这是某种内存泄漏,但我在我的代码中看不到是什么原因造成的。

0 投票
1 回答
1099 浏览

connection - QTcpSocket false 连接到 QTcpServer

一段时间以来,我一直在使用 Qt(对不起我的英语)。我现在正在使用 QtNetwork。

我需要创建一个类似系统的客户端服务器。基本思路如下:

  • 两者(客户端和服务器)的 IP 都可以更改。无法将服务器 IP 存储在客户端的配置文件中。因此,服务器必须以某种方式公开其 IP,并且客户端必须能够检测到要连接的服务器 IP。

  • 客户端必须能够在没有服务器的情况下工作,并更新服务器(一旦连接)它的工作。

  • 客户端和服务器在同一个 WLAN 网络中运行,因此无需通过 Internet 连接。

  • 这个新系统旨在替换旧系统(也包括客户端和服务器)。旧服务器仅使用 UDP 广播消息与客户端通信,因此,有时消息会丢失。

因此,对于第一点,我在服务器中实现了一个计时器。此计时器每 X 次通过 UDP 发送一条带有消息“连接到服务器”的广播消息。此消息的想法是客户端检测到此类消息并获取服务器 IP 进行连接。

服务器使用 QTcpServer 来检测客户端连接,并为每个客户端存储一个新的 QTcpSocket 进行通信。

客户端在获得服务器 IP 后使用 TcpSocket 进行连接。

听起来很简单。

我已经实现了连接系统,并且在本地机器(服务器和一些在同一台机器上运行的客户端)中,系统可以正常工作。可以完成连接并且可以进行通信。客户端和服务器都使用 gcc 4.7.2 在 Chakra Linux 64 位上编译。系统上安装的Qt版本是4.8.4。

现在,我用两台真机测试了系统(服务器在 Chakra Linux 64 位上运行,客户端在 Windows 7(一些 32 位和另一个 64 位)和两台 Windows 8(只有 32 位)上运行)。客户端的 Windows 版本已在运行 Windows 7 32 位、Qt 4.8.3 和 MingW 4.6.2 的虚拟机 (VirtualBox 4.2.4) 上编译。Windows 客户端运行所有 32 位编译版本的客户端(所有 32 位 Windows 机器和 64 位 Windows 机器)。

客户端可以检测和读取广播消息(UDP,工作在45454端口),一旦他们得到服务器IP(检测到的IP是正确的),他们会尝试连接。

问题是,从 7 个客户端中,只有一个 Windows 8 连接了一次。所有客户端都尝试连接,所有的 QTcpSocket 都发出“已连接”信号,但服务器没有检测到任何连接。

这完全是随机的,因为有时我可以连接 1 或 2 个客户端。其他时候没有。

此代码用于客户端广播初始化。

此代码来自客户端,当接收到服务器广播消息时。

在服务器端,我有这个代码来初始化:

这是连接新客户端的代码的一部分:

“sendToClient”成员函数只在连接后向客户端发送消息。

所以,问题是,我不知道为什么会有这么随机的连接,大多数时候是错误的连接(客户端再次发出连接的信号,但是在服务器端,当客户端没有发出信号时连接...)。

我不知道我做错了什么......

客户端和服务器都使用 UDP 端口 45454 和 TCP 端口 8888。我已经更改了 TCP 端口值(在客户端、服务器和两者上)和同样的故事。我已经更改了 TCP 端口,如果两者上的端口不同,则消息不会到达客户端...

对不起,很长的文字,但我认为最好告诉你我做了什么......

我正在寻找关于哪一个可能是我的问题的建议,或者如果我的代码有问题......但请记住,有时(并且只是有时)一两个客户端可以真正连接......

0 投票
1 回答
7565 浏览

c++ - QTcpSocket receiving transfer

I'm having issues with receiving a transfer.

QTcpSocket->readAll() does not read enough bytes when I'm sending to it. When I send 15k bytes, it reads only some part of it and then does nothing. What am I doing wrong?

Why does this happen?

0 投票
1 回答
1460 浏览

c++ - QThread 和 QTcpSocket

我在做一些项目时犯了严重的错误,现在我必须从底部重新编程。我正在编写多线程服务器,它将处理连接、请求等。但是,当我用 base 创建新类时QThread 的对象,我用 QThread->run() 启动线程,而不是 QThread->start()。现在我得到一堆错误。这里的情况。我有服务器,它在每个连接上创建新线程并开始从每个连接的客户端读取数据。当我收到数据时,它会发出连接到主 GUI 类的信号并显示结果正常。它还保存用于回复消息的套接字句柄。当我从 GUI 类向套接字写入数据时,它说:

QObject:无法为不同线程中的父级创建子级。(Parent 是 QNativeSocketEngine(0x23a6c38),parent 的线程是 MyThread(0x1fb8670),当前线程是 QThread(0x9eb980)

怎么了?

0 投票
1 回答
1492 浏览

c++ - 将现有的 QTcpSocket 变形为 QSslSocket

是否可以创建一个新的 QSslSocket 并让它接管现有的 TCP 连接,并丢弃旧的 QTcpSocket,而不中断或关闭 TCP 连接?

我需要它来在我的 FTP 服务器中实现显式 FTPS,这要求最初连接是未加密的,并且只有在 FTP 客户端的请求(命令AUTH SSLAUTH TLS)时,如果它出现,就会启动 SSL/TLS 握手。

0 投票
1 回答
508 浏览

c++ - QTcpSocket 可以释放它的描述符吗

QTcpSocket 是否可以释放其描述符,以便可以将套接字的所有权转移到不同线程上的另一个 QTcpSocket 对象或 QSslSocket,而无需关闭/中断套接字?

0 投票
2 回答
2665 浏览

qt - 带有 QtConcurrent::run 的 Qt QTcpSocket 需要在单独的线程中进行事件循环

我在 Qt 中有一个 Web 服务器,它将读取一个非常大的(~1Gb)文件并通过 QTcpSocket 将数据返回给请求者。此套接字由主服务器线程创建。我想使用 QtConcurrent 将此套接字移交给工作线程并将数据发送回那里。

我的“returnPartialLargeFile”函数如下所示:

我得到的错误是,如果我将 'loop.exec()' 行注释掉,我会收到以下错误:

如果我取消注释,那么我的函数会在 exec() 行短路,并且永远不会向套接字写入数据,但是我没有收到任何错误,我只是得到一个不包含来自 while 循环的任何数据的截断响应.

我正在重新设置套接字并将其移至新线程,因此我希望我的问题仅与事件循环以及套接字信号和插槽有关。关于我在这里做错了什么的任何想法?我怎样才能让它工作?如果信号/插槽问题,我需要在这里连接哪个?谢谢 -

0 投票
1 回答
920 浏览

multithreading - Qt 应用程序在删除执行的任务时崩溃

我有多线程服务器(继承 QTcpServer)。当出现新连接时,我创建新任务(继承 QRunnable),将套接字描述符传递给构造函数并将此任务推送到 QThreadpool(有 3 个工作人员)。

在 run() 中,我动态创建 QTcpSocket,设置套接字描述符并读取第一个接收到的字节。基于这个字节的值,我创建了新的特定任务(也继承了 QRunnable),将它的 ctr 指针传递给早先创建的 QTcpSocket 对象,并将这个任务推送到 QThreadpool。

此特定任务会导致一些例行程序和应用程序崩溃。从日志文件中,我看到调用了这个特定任务的析构函数。

Qt Creator 还会引发下一条错误消息:

QObject:无法为不同线程中的父级创建子级。(父级是 QNativeSocketEngine(0x18c62290),父级线程是 QThread(0x18c603e0),当前线程是 QThread(0x18cc3b60) QSocketNotifier:不能从另一个线程禁用套接字通知 QCoreApplication::sendEvent 中的断言失败:“无法将事件发送到一个拥有的对象不同的线程。当前线程 18cc3b60。接收器“”(类型为“QNativeSocketEngine”)是在线程 18c603e0”中创建的,文件 kernel/qcoreapplication.cpp,第 420 行

我发现了类似的帖子,但不幸的是我不明白如何解决我的问题。请帮我。

0 投票
2 回答
397 浏览

multithreading - 在单独的线程中处理每个 TCP 连接会改善延迟吗?

我有一个 FTP 服务器,在 QTcpServer 和 QTcpSocket 之上实现。

我利用信号和槽机制同时支持多个 TCP 连接,即使我只有一个线程。我的代码尽快返回到事件循环,它不会阻塞(没有等待函数),并且它不会在任何地方使用嵌套事件循环。这样我就已经有了协同多任务处理,就像 Win3.1 应用程序一样。

但是很多其他 FTP 服务器都是多线程的。现在我想知道使用单独的线程来处理每个 TCP 连接是否会提高性能,尤其是延迟

一方面,线程会增加延迟,因为您需要为每个新连接启动一个新线程,但另一方面,在我的协作多任务处理中,其他 TCP 连接必须等到我返回主循环后才能发出readyRead()/bytesWritten()信号可以处理。

0 投票
1 回答
591 浏览

qt - 通过 QTcpSocket 或 QSslSocket 发送 QDataStream

我想通过 ssl 或 tcp 套接字发送序列化数据。QIODevice::write 不发送 QDataStream,而只发送 char* 和 QByteArray。

有没有办法通过套接字发送序列化数据?或者如何将 QDataStream 转换为 QByteArray?

谢谢