当前位置 博文首页 > 木木木 的博客:Qt开发之路27---UDP (Socket通信)

    木木木 的博客:Qt开发之路27---UDP (Socket通信)

    作者:[db:作者] 时间:2021-08-20 21:38

    一:UDP

    使用Qt提供的QUdpSocket进行UDP通信。在UDP方式下,客户端并不与服务器建立连接,它只负责调用发送函数向服务器发送数据。类似的服务器也不从客户端接收连接,只负责调用接收函数,等待来自客户端的数据的到达。

    在UDP通信中,服务器端和客户端的概念已经显得有些淡化,两部分做的工作都大致相同:

    • 创建套接字
    • 绑定套接字
      在UDP中如果需要接收数据则需要对套接字进行绑定,只发送数据则不需要对套接字进行绑定。
      通过调用**bind()**函数将套接字绑定到指定端口上。
    • 接收或者发送数据
    • 接收数据:使用**readDatagram()**接收数据,函数声明如下:
    qint64	readDatagram(char * data, qint64 maxSize, QHostAddress * address =0,quint16*port = 0)
    

    参数:

    • data: 接收数据的缓存地址
    • maxSize: 缓存接收的最大字节数
    • address: 数据发送方的地址(一般使用提供的默认值)
    • port: 数据发送方的端口号(一般使用提供的默认值)

    使用**pendingDatagramSize()**可以获取到将要接收的数据的大小,根据该函数返回值来准备对应大小的内存空间存放将要接收的数据。

    发送数据: 使用**writeDatagram()**函数发送数据,函数声明如下:

    qint64	writeDatagram(const QByteArray & datagram, const QHostAddress & host, quint16 port)
    

    参数:

    • datagram:要发送的字符串
    • host:数据接收方的地址
    • port:数据接收方的端口号

    二:广播

    在使用QUdpSocket类的writeDatagram()函数发送数据的时候,其中第二个参数host应该指定为广播地址:QHostAddress::Broadcast此设置相当于QHostAddress(“255.255.255.255”)

    使用UDP广播的的特点:

    • 使用UDP进行广播,局域网内的其他的UDP用户全部可以收到广播的消息
    • UDP广播只能在局域网范围内使用

    三:组播

    再使用广播发送消息的时候会发送给所有用户,但是有些用户是不想接受消息的,这时候我们就应该使用组播,接收方只有先注册到组播地址中才能收到组播消息,否则则接受不到消息。另外组播是可以在Internet中使用的。
    在使用QUdpSocket类的writeDatagram()函数发送数据的时候,其中第二个参数host应该指定为组播地址,关于组播地址的分类:

    • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    • 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
    • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
      注册加入到组播地址需要使用QUdpSocket类的成员函数:
    bool	joinMulticastGroup(const QHostAddress & groupAddress)
    

    上一篇:Qt开发之路26—TCP/IP (Socket通信)
    下一篇:Qt开发之路28—TCP 连接的“ 三次握手 ”与“ 四次挥手 ” (Socket通信)

    cs