• Qt中对Udp数据打包发送和接收


    有些小伙伴对怎么对Udp的数据打包不太清楚。下面我举例说明。

    比如我们要发送一个Person的数据。可以先用一个结构把Person的数据封装。

    1. struct Person {
    2. QString name;
    3. int age;
    4. };

    下面是udp客户端和服务器端完整的代码例子。

    1. #ifndef UDPCLIENT_H
    2. #define UDPCLIENT_H
    3. #include
    4. #include
    5. struct Person {
    6. QString name;
    7. int age;
    8. };
    9. class UdpClient : public QObject
    10. {
    11. Q_OBJECT
    12. public:
    13. explicit UdpClient(QObject *parent = nullptr);
    14. void sendDatagram(const QByteArray &data);
    15. private slots:
    16. void readPendingDatagrams();
    17. private:
    18. void processDatagram(const QNetworkDatagram &datagram);
    19. QUdpSocket *udpSocket;
    20. };
    21. #endif // UDPCLIENT_H
    22. #include "UdpClient.h"
    23. #include
    24. #include
    25. UdpClient::UdpClient(QObject *parent) : QObject(parent) {
    26. udpSocket = new QUdpSocket(this);
    27. udpSocket->bind(QHostAddress::LocalHost, 1235);
    28. connect(udpSocket, &QUdpSocket::readyRead, this, &UdpClient::readPendingDatagrams);
    29. }
    30. void UdpClient::sendDatagram(const QByteArray &data) {
    31. udpSocket->writeDatagram(data, QHostAddress::LocalHost, 1234);
    32. }
    33. void UdpClient::readPendingDatagrams() {
    34. while (udpSocket->hasPendingDatagrams()) {
    35. QNetworkDatagram datagram = udpSocket->receiveDatagram();
    36. processDatagram(datagram);
    37. }
    38. }
    39. void UdpClient::processDatagram(const QNetworkDatagram &datagram) {
    40. QByteArray data = datagram.data();
    41. // Here you would process the data
    42. QDataStream stream(data);
    43. Person person;
    44. stream >> person.name >> person.age;
    45. // 现在你可以使用 person 结构中的数据
    46. qDebug() << "Received person: " << person.name << ", " << person.age;
    47. }
    48. #ifndef UDPSERVER_H
    49. #define UDPSERVER_H
    50. #include
    51. #include
    52. class UdpServer : public QObject
    53. {
    54. Q_OBJECT
    55. public:
    56. explicit UdpServer(QObject *parent = nullptr);
    57. private slots:
    58. void readPendingDatagrams();
    59. private:
    60. void processDatagram(const QNetworkDatagram &datagram);
    61. QUdpSocket *udpSocket;
    62. };
    63. #endif // UDPSERVER_H
    64. #include "UdpServer.h"
    65. #include
    66. UdpServer::UdpServer(QObject *parent) : QObject(parent) {
    67. udpSocket = new QUdpSocket(this);
    68. udpSocket->bind(QHostAddress::LocalHost, 1234);
    69. connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);
    70. }
    71. void UdpServer::readPendingDatagrams() {
    72. while (udpSocket->hasPendingDatagrams()) {
    73. QNetworkDatagram datagram = udpSocket->receiveDatagram();
    74. processDatagram(datagram);
    75. }
    76. }
    77. void UdpServer::processDatagram(const QNetworkDatagram &datagram) {
    78. QByteArray data = datagram.data();
    79. // Here you would process the data
    80. // ...
    81. //qDebug() << "Received data from client: " << data.toStdString().c_str();
    82. // Sending a response back to the sender
    83. udpSocket->writeDatagram(data, datagram.senderAddress(), datagram.senderPort());
    84. }
    85. #include
    86. #include
    87. #include "UdpServer.h"
    88. #include "UdpClient.h"
    89. int main(int argc, char *argv[])
    90. {
    91. QCoreApplication a(argc, argv);
    92. UdpServer server;
    93. UdpClient client;
    94. Person person;
    95. person.name = "Alice";
    96. person.age = 30;
    97. QByteArray datagram;
    98. QDataStream stream(&datagram, QIODevice::WriteOnly);
    99. stream << person.name << person.age;
    100. client.sendDatagram(datagram);
    101. return a.exec();
    102. }

  • 相关阅读:
    力扣------两数之和
    自动化测试有必要学吗?
    scp(安全拷贝)和rsync(增量复制)
    软件复杂性的来源与应对
    组态软件在物联网中的应用
    c++通过tensorRT调用模型进行推理
    ESP8266--Arduino开发(驱动OLED显示文字和图片)
    【架构设计】.Net Core负载均衡实现
    告别单调,Django后台主页改造 - 使用AdminLTE组件
    gRPC之metadata
  • 原文地址:https://blog.csdn.net/exlink2012/article/details/134338376