qt-udp协议编程

来源:互联网 发布:登录我的淘宝 编辑:程序博客网 时间:2024/05/29 18:01

作者:  使徒保罗

邮箱:  297329588szh@163.com

声明:  欢迎交流学习,如有任何疑问,请通过邮箱联系本人

应用场景:  qt udp通信

开发环境:  windows10 64位+qt5.7(mingw).exe

注意:

本文有服务器端和客户端程序代码组成,各位同学可以先跑服务器程序,然后跑客户端程序就可以看到通信效果了.

udp client:

pro文件增加network模块: 

QT += core network


udpclient.h:

#ifndef UDPCLIENT_H
#define UDPCLIENT_H
#include <QUdpSocket>
class UdpClient : public QObject
{
    Q_OBJECT
public:
    explicit UdpClient(QObject *parent = 0);
    ~UdpClient();
    void setPort(quint16 nPort);
    void setIPAndPort(QString strIP, quint16 nPort);
    qint64 SendData(const char *data, qint64 size);
    qint64 SendData(const QByteArray &datagram);
signals:
public slots:
    void slotOnSocketErr();
private:
    quint16 m_nTargetPort;
    QHostAddress m_targetHostAddress;
    QUdpSocket* m_pUdpSocket;
};
#endif // UDPCLIENT_H

udpclient.cpp

#include "udpclient.h"
UdpClient::UdpClient(QObject *parent) : QObject(parent)
{
    m_pUdpSocket = new QUdpSocket(this);
    connect(m_pUdpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotOnSocketErr()));
}
UdpClient::~UdpClient()
{
    if(m_pUdpSocket)
    {
        m_pUdpSocket->deleteLater();
    }
}
void UdpClient::setPort(quint16 nPort)
{
    m_nTargetPort = nPort;
}
void UdpClient::setIPAndPort(QString strIP, quint16 nPort)
{
    m_targetHostAddress.setAddress(strIP);
    m_nTargetPort = nPort;
}
/*
 * @return: Returns the number of bytes sent on success; otherwise returns -1
 *
*/
qint64 UdpClient::SendData(const char *data, qint64 size)
{
    qint16 nRet = -1;
    if(data == NULL || size <= 0)
    {
        return nRet;
    }
    nRet = m_pUdpSocket->writeDatagram(data, size, m_targetHostAddress, m_nTargetPort);
    return nRet;
}
/*
 * @return: Returns the number of bytes sent on success; otherwise returns -1
 *
*/
qint64 UdpClient::SendData(const QByteArray &datagram)
{
    qint16 nRet = -1;
    if(datagram.size() <= 0)
    {
        return nRet;
    }
    nRet = m_pUdpSocket->writeDatagram(datagram, m_targetHostAddress, m_nTargetPort);
    return nRet;
}
void UdpClient::slotOnSocketErr()
{
    qDebug("socket err: %s errcode=%d", m_pUdpSocket->errorString().toStdString().c_str(), m_pUdpSocket->error());
}

udpclient main.cpp

#include <QCoreApplication>
#include <udpclient.h>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    UdpClient client;
    client.setIPAndPort("127.0.0.1", 6000);
    char szMsg[] = "Hello world!";
    qint16 nBytes = client.SendData(szMsg, sizeof(szMsg));
    if(-1 == nBytes)
    {
        qDebug("send failed.\n");
    }
    else
    {
        qDebug("send success. bytes size = %d\n", nBytes);
    }
    return a.exec();
}

udpserver :

pro增加network模块

QT += core network

udpserver.h

#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QUdpSocket>
class UdpServer : public QObject
{
    Q_OBJECT
public:
    explicit UdpServer(quint16 nPort, QObject *parent = 0);
signals:
public slots:
    void slotOnSocketErr();
    void slotReadPendingDatagrams();
private:
    QUdpSocket* m_pUdpSocket;
};
#endif // UDPSERVER_H

udpserver.cpp

#include "udpserver.h"
UdpServer::UdpServer(quint16 nPort, QObject *parent) : QObject(parent)
{
    m_pUdpSocket = new QUdpSocket(this);
    QHostAddress hostAddress = m_pUdpSocket->localAddress();
    if(!m_pUdpSocket->bind(hostAddress, nPort))
    {
        qDebug("udp server bind port failed.");
    }
    connect(m_pUdpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotOnSocketErr()));
    connect(m_pUdpSocket, SIGNAL(readyRead()),this, SLOT(slotReadPendingDatagrams()));
}
void UdpServer::slotOnSocketErr()
{
    qDebug("socket err: %s errcode=%d", m_pUdpSocket->errorString().toStdString().c_str(), m_pUdpSocket->error());
}
void UdpServer::slotReadPendingDatagrams()
{
    while (m_pUdpSocket->hasPendingDatagrams()) {
        QHostAddress senderIp;
        quint16 senderPort;
        QByteArray datagram;
        datagram.resize(m_pUdpSocket->pendingDatagramSize());
        if (m_pUdpSocket->readDatagram(datagram.data(), datagram.size(),
                                         &senderIp, &senderPort) == -1)
        {
             continue;
        }
        qDebug("recv data: %s len=%d\n",datagram.data(), datagram.size());
    }
}

udpserver mian.cpp

#include <QCoreApplication>
#include "udpserver.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    UdpServer server(6000);
    return a.exec();
}

原创粉丝点击