qt-udp协议编程

9 篇文章 0 订阅

作者:  使徒保罗

邮箱:  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,QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint))
    {
        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();
}
 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使徒保罗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值