一、总结

  • UDP 就像写信,可能会丢包
  • Linux UDP 通信过程 LinuxUDP通信.jpg
  • Qt UDP 通信过程 QtUDP通信.jpg
  • 支持多路组播:D 类地址
    组播地址分类.jpg
  • 局域网广播 IP: 255.255.255.255

二、每个实例都可以是服务端

  • 只需要一个套接字,绑定到端口号即可
    setWindowTitle(QString("服务器端口为:%1").arg(port));

    udpSocket = new QUdpSocket(this);
    // 只需要绑定端口号,不用开启监听
    udpSocket->bind(port);
    connect(udpSocket, &QUdpSocket::readyRead,[=](){
        char buf[1024] = {0};
        QHostAddress clientAddr;    // 发送方 IP
        quint16 clientPort;         // 发送方 Port
        qint64 len = udpSocket->readDatagram(buf, sizeof (buf), &clientAddr, &clientPort);
        qDebug() << "接收到" << len;
        if(len > 0){
            QString str = QString("[%1:%2] %3").arg(clientAddr.toString()).arg(clientPort).arg(buf);
            ui->textEditRead->append(str);
        }
    });
  • 发送消息
    QString ip = ui->lineEditIP->text();
    int port = ui->lineEditPort->text().toInt();
    QString str = ui->textEditWrite->toPlainText();
    // 注意:使用 QByteArray 传递,通过.data()转为char*后中文乱码
    udpSocket->writeDatagram(str.toUtf8(), QHostAddress(ip), port);
  • 关闭连接
    udpSocket->disconnect();
    udpSocket->close();