• QUdpSocketQt使用Udp通讯实现服务端和客户端


    博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn

    如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅

    版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
    本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:https://www.techieliang.com/2017/12/532/

    1. QNetworkDatagram

    qt网络报文,可用其建立一个通讯内容包括目标ip、端口号、数据内容。同时接收到的信息也未此类型,可以访问接收数据的长度、发送者的ip及端口等信息

    详情请见帮助

    QUdpSocket

    有Qt提供的udp通讯的类,详细介绍请见官方文档

    2. 客户端

    注意pro文件要包含QT += network

    1. #include <QHostAddress>
    2. #include <QUdpSocket>
    3. QUdpSocket *m_socket=new QUdpSocket;
    4. m_socket.writeDatagram(msg, QHostAddress::localhost, 8000);

    qudpsocket对于发送数据报文提供了三个重载函数:

    1. qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
    2. qint64 writeDatagram(const QNetworkDatagram &datagram)
    3. qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

    上面的范例使用的是第三种类型,也可以自行建立QNetworkDatagram对象,修改好内容后直接调用writeDatagram

    3. 服务端

    服务端与客户端类似,需要先绑定端口“bind”,此函数在QAbstractSocket类中提供

    1. bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform)
    2. bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)

    具体使用方式:

    1. m_socket = new QUdpSocket;
    2. m_socket->bind(QHostAddress::localhost, 8000);
    3. connect(m_socket, SIGNAL(readyRead()), this, SLOT(receive()));

    绑定端口以后,需要将此socket的readyread信号与自定义槽函数连接,当服务端收到消息时会触发此信号。

    4. 消息收发

    由于udp与tcp不同,不需要三次握手建立连接,所以并不会在连接之后记录当前socket。

    发送消息在客户端中已经提供示例

    接收消息需要使用Qudpsocket提供以下函数:

    1. qint64 pendingDatagramSize() const
    2. qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
    3. QNetworkDatagram receiveDatagram(qint64 maxSize = -1)

    当readyRead信号触发时,可直接通过receiveDatagram函数获取消息报文对象,其内存储消息的发送ip、端口、消息内容等所有信息。

    也可以通过pendingDatagramSize判断消息长度,然后通过readDatagram获取消息内容。

    在readyRead槽函数中可以先调用QUdpSocket::hasPendingDatagrams判断当前是否有需要读取的消息,若有消息再进行pendingDatagramSize获取需要读取的大小

    转载请以链接形式标明本文标题和地址:Techie亮博客 » QUdpSocket-Qt使用Udp通讯实现服务端和客户端
  • 相关阅读:
    用户界面线程(含有消息泵的线程)主线程与用户界面线程的通信
    poj 2151 Check the difficulty of problems 概率dp
    Codeforces 148D Bag of mice 概率dp
    [置顶] UVa在线比赛单题汇总DP专题
    UVa 10405 Longest Common Subsequence 最长公共子序列模板
    UVa 12018 Juice Extractor 切水果dp暂时存疑
    UVa 674 Coin Change 背包dp
    hdu 3853 LOOPS 圆环之理 概率dp
    UVa 111 History Grading 最长递增子序列 LIS
    UVa在线比赛单题汇总DP专题
  • 原文地址:https://www.cnblogs.com/techiel/p/7978049.html
Copyright © 2020-2023  润新知