当前位置: 首页 > 知识库问答 >
问题:

如何使用Qt UDP套接字发送和接收大数据?

邵骏喆
2023-03-14

我想使用Qt UDP(不是TCP)套接字传输文件。所以我这样写代码:

QFile file1(QString::fromStdString(filedir));
QByteArray bytes;
file1.open(QIODevice::ReadOnly);
QTextStream in(&file1);
while (!in.atEnd()) {
    bytes = in.read(8192).toAscii();
    udpSocket.writeDatagram(bytes, QHostAddress(ip), port.toInt());
}
udpSocket1.bind(ui->sendPort->text().toInt());
connect(&udpSocket1,SIGNAL(readyRead()),this,SLOT(listenfile()));

void Widget::listenfile() {
    QFile file("received.txt");
    file.resize(0);
    file.open(QIODevice::Append);
    QTextStream out(&file);
    do {
        QByteArray data;
        data.resize(udpSocket1.pendingDatagramSize());
        udpSocket1.readDatagram(data.data(),data.size());
        QString str=data.data();
        ui->textBrowser1->append(str);
        out << data;
    } while (udpSocket1.hasPendingDatagrams());
}

看来要传输的Qt UDP数据包的最小大小是8192字节。接收方总是得到第一个数据包,但不能接收其他数据包。

我对Qt和网络编程的经验很少,所以我不知道我的猜想对不对。你能告诉我如何改变这些代码来支持在第一个数据包之后接收数据包,这样我就可以传输大数据了吗?

共有1个答案

夏锐藻
2023-03-14

调试了很长时间并使用Wireshark捕获数据包之后。我认为问题的原因是QUdpSocket本身。像互联网上的许多其他例子一样,我的代码可能是对的。但是QUdpSocket类不适合传输大数据。因为当连接到readyRead()的slot函数正在执行时,后续的数据报在函数完成之前无法再次触发它。所以发送方在发送一些数据后必须Hibernate一段时间,以等待接收方的时隙功能。

结论是QUdpSocket类不是一个可靠的传输大数据的类。采用低层套接字API,定制一些协议,设计多进程/多线程体系结构,从根本上解决问题。当然,使用TCP套接字是另一种选择。

 类似资料:
  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:

  • 我计划做一个项目,其中包括一个作为visual studio控制台应用程序的服务器和一个作为qt应用程序的客户端应用程序,我想知道是否有可能在这两个应用程序之间发送和接收数据,如果是的话,我还想知道它是否也能在android上工作,在windows作为windows服务器端和android作为客户端之间工作 注意:服务器将使用winsock,客户端将使用qt套接字,两个应用程序将使用tcp套接字

  • 我在网上搜索了很多,但是没有找到通过套接字发送对象并按原样接收的解决方案。我知道它需要酸洗,我已经做过了。将其转换为字节,然后从另一方面接收。但如何将这些字节转换为该类型的对象。 这是在客户端将对象转换为StringIO并发送到服务器的代码。在服务器端,我得到字节。现在我正在搜索要再次转换为StringIO的字节,以便获得对象值。 在代码中,对象被包装在StringIO中,并通过套接字发送。任何更