首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UDP协议和readDatagram接收数据

使用UDP协议和readDatagram接收数据
EN

Stack Overflow用户
提问于 2014-06-12 13:12:18
回答 1查看 7.7K关注 0票数 1

在第一个主题帮助我正确地将数据发送给使用UDP协议的人之后,我在接收这些数据时遇到了问题。这个问题很奇怪,只在我第一次启动发送数据的函数时才会发生。第一次,服务器只接收第一帧。但是之后,如果我使用这个函数,一切都很好。

下面是通过UDP协议发送数据的代码(我的数据是一个结构):

代码语言:javascript
复制
void MyUDP::sendUDP()
{
    //Structure to send
    typedef struct MyStructTag
    {
       int test1;
       bool test2;
       char test3;
    } MyStruct;

    MyStruct envoie;

    envoie.test1 = 1;
    envoie.test2 = true;
    envoie.test3 = 97;

    // Sends the datagram datagram
    // to the host address and at port.
    // qint64 QUdpSocket::writeDatagram(const QByteArray & datagram,
    //                      const QHostAddress & host, quint16 port)

    QByteArray buf;
    QDataStream s(&buf, QIODevice::WriteOnly);
    // The encoding is big endian by default, on all systems. You
    // can change it if you wish.
    if (false) s.setByteOrder(QDataStream::LittleEndian);
    s << (qint32)envoie.test1 << (quint8)envoie.test2 << (qint8)envoie.test3;

    //I'm sending 5 frames        

    socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
    socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
    socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
    socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
    socket->writeDatagram(buf, QHostAddress("10.100.14.79"), 4000);
}

下面是允许我接收这些数据的函数:

代码语言:javascript
复制
void MyUDP::readyRead()
{

    QHostAddress sender;
    quint16 senderPort;

    // qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize,
    //                 QHostAddress * address = 0, quint16 * port = 0)
    // Receives a datagram no larger than maxSize bytes and stores it in data.
    // The sender's host address and port is stored in *address and *port
    // (unless the pointers are 0).

    typedef struct MyStructTag
    {
       int test1;
       bool test2;
       char test3;

    } MyStruct;

    MyStruct recois;
    socket->readDatagram((char*)&recois, sizeof (recois), &sender, &senderPort);


    qDebug() << "Message from: " << sender.toString();
    qDebug() << "Message port: " << senderPort;
    qDebug() << "Message: " << recois.test3;
}

为什么我第一次启动sendUDP时只收到一个帧?

EN

回答 1

Stack Overflow用户

发布于 2014-06-12 13:52:24

在你的问题中没有足够的信息来确定,但是当你读一份数据报时,你每读一次只能得到一个数据报。与以流模式读取的TCP不同,UDP是面向消息的.如果您想要读取更多的消息,请在一个循环中多次读取或读取它们。还请注意,你不能依赖保证订单,甚至保证交货.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24185337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档