QUdpSocket-Qt使用Udp通信实现服务端和客户端

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

1. QNetworkDatagram

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

详情请见帮助网络

QUdpSocket

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

2. 客户端

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

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

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

  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类中提供post

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

具体使用方式:ui

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

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

4. 消息收发

因为udp与tcp不一样,不须要三次握手创建链接,因此并不会在链接以后记录当前socket。spa

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

接收消息须要使用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通信实现服务端和客户端
相关文章
相关标签/搜索