Qt Udp网络通信

       严格来说,UDP通信没有服务端与客户端的概念,UDP是轻量级、不可靠的网络通信协议,只有信息的发送方和接收方,而且通信双方的角色可变,通信的双方在特定的IP和端口处收发数据,不需要确认。

  • 1 点对点通信  

关键代码:

  • 初始化
{
     
    m_pSocketSender = new QUdpSocket;
    m_pSocketReceiver = new QUdpSocket;
    m_pSocketReceiver ->bind(QHostAddress(m_sIP),m_Port);
    connect(m_pSocketReceiver,SIGNAL(readyRead()),this,SLOT(recvData()));    connect(m_pBtnSend,&QPushButton::clicked,this,&UdpWidget::sendData);

}
  • 发送数据
void UdpWidget::sendData()
{
    QByteArray block;
    block.resize(7);
    QDateTime time2u = QDateTime::currentDateTime();
    block[0] = 0xEB;
    block[1] = 0x90;
    quint16 hour = time2u.time().hour();
    int min = time2u.time().minute();
    hour = htons(hour);
    min = hton(min);
    char* pBuf = block.data();
    memcpy(pBuf+2,&hour,2);
    memcpy(pBuf+4,((char*)(&min))+1,3);
    QHostAddress address(m_sIP);
    int len = m_pSocketSender ->writeDatagram(block,address,m_Port);
    if(len != 7){
        logError("udp send data failed!");
    }
    else {
        logInfoData("udp send",pBuf,7);
    }
    block.clear();
}
  • 接收数据
void UdpWidget::recvData()
{
    if(m_pSocketReceiver ->hasPendingDatagrams()){
        QByteArray pData;
        pData.resize(m_pSocketReceiver ->pendingDatagramSize());
        QHostAddress address(m_sIP);
        m_pSocketReceiver ->readDatagram(pData.data(),pData.size());
        logInfoData("udp recv",pData.data(),pData.size());

    }
}

  • 2 广播通信

关键代码:

  • 初始化
{
     
    m_pSocketSender = new QUdpSocket;
    m_pSocketReceiver = new QUdpSocket;
    m_pSocketReceiver ->bind(m_Port);
    connect(m_pSocketReceiver,SIGNAL(readyRead()),this,SLOT(recvData()));
    connect(m_pBtnSend,&QPushButton::clicked,this,&UdpWidget::sendData);
}
  • 发送数据
void UdpWidget::sendData()
{
    QByteArray block;
    block.resize(7);
    QDateTime time2u = QDateTime::currentDateTime();
    block[0] = 0xEB;
    block[1] = 0x90;
    quint16 hour = time2u.time().hour();
    int min = time2u.time().minute();
    hour = htons(hour);
    min = hton(min);
    char* pBuf = block.data();
    memcpy(pBuf+2,&hour,2);
    memcpy(pBuf+4,((char*)(&min))+1,3);
    int len = m_pSocketSender ->writeDatagram(block,QHostAddress::Broadcast,m_ServerPort);
    if(len != 7){
        logError("udp send data failed!");
    }
    else {
        logInfoData("udp send",pBuf,7);
    }


}
  • 接收数据
void UdpWidget::recvData()
{
    if(m_pSocketReceiver ->hasPendingDatagrams()){
        QByteArray pData;
        qint64 size = m_pSocketReceiver ->pendingDatagramSize();
        pData.resize(size);
        m_pSocketReceiver->readDatagram(pData.data(),pData.size());
        size = pData.size();
        logInfoData("udp server recv",pData.data(),pData.size());
        pData.clear();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值