Qt udp socket用于进程间通信
2015-10-20 23:26
519 查看
简单协议可以使用:json + base64(有需要)
#ifndef UDPSOCKET_H #define UDPSOCKET_H #include <QObject> #include <QMap> #include <QHostAddress> #include <functional> class QUdpSocket; class UdpSocket : public QObject { Q_OBJECT public: struct Address { Address() : port(0) { } Address(const QHostAddress &_host, int _port) : host(_host), port(_port) { } QHostAddress host; int port; }; typedef std::function<void(quint64 number, const QByteArray &data)> ReveivedHandleFunc; explicit UdpSocket(QObject *parent = 0); void init(int port, int isServer, const ReveivedHandleFunc &func); void send(quint64 number, const QByteArray &data); private slots: void slotReadPendingData(); private: void processTheDatagram(const QByteArray &data); private: QUdpSocket *m_udp; int m_port; bool m_isServer; ReveivedHandleFunc m_receivedHandleFunc; quint64 m_number; QMap<quint64, Address> m_msg; }; #endif // UDPSOCKET_H
#include "udpsocket.h" #include <QHostAddress> #include <QUdpSocket> UdpSocket::UdpSocket(QObject *parent) : QObject(parent), m_udp(NULL), m_port(0), m_isServer(false), m_number(0) { } void UdpSocket::init(int port, int isServer, const ReveivedHandleFunc &func) { if (NULL == m_udp) { m_udp = new QUdpSocket(this); connect(m_udp, SIGNAL(readyRead()), this, SLOT(slotReadPendingData())); if (isServer) { m_udp->bind(QHostAddress::LocalHost, port); } } m_port = port; m_isServer = isServer; m_receivedHandleFunc = func; } void UdpSocket::send(quint64 number, const QByteArray &data) { if (!m_udp) { return; } if (m_isServer) { if (m_msg.contains(number)) { Address address = m_msg[number]; m_msg.remove(number); m_udp->writeDatagram(data, address.host, address.port); } } else { m_udp->writeDatagram(data, QHostAddress::LocalHost, m_port); } } void UdpSocket::slotReadPendingData() { if (NULL == m_udp) { return; } while (m_udp->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(m_udp->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; if (m_udp->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort) >= 0) { ++m_number; if (m_msg.size() > 3000) { m_msg.clear(); } m_msg[m_number] = Address(sender, senderPort); if (m_receivedHandleFunc) { m_receivedHandleFunc(m_number, datagram); } } } }
相关文章推荐
- Qt thread and eventloop
- 惠普功能测试UFT(QTP)使用心得
- QT4.8.5+qt-vs-addin-1.1.11+VS2010安装配置和QT工程的新建和加载
- Qt问题记录
- 用Qt Creator编写代码+ vs2010编译调试的配置
- OPenGL-2D Painting Example in Qt4.
- 物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
- Qt4.8.5 、Qt Creator、MinGW 4.4在win7 sp1 x64 下安装(也含Qt5.0以上版本windows下安装)
- [Qt]调用外部执行程序(Windows & Mac)
- Qt: QT + openCV 实现摄像头采集以及拍照功能
- Qt自适应大小显示图片,添加菜单
- QT中显示图像数据
- 初次使用Qt Creater网络编程,出现error: undefined reference to `_imp__WSAStartup@8'
- Customizing Qt Widgets Using Style Sheets
- Qt Designer Integration
- 解析Qt自带的Style示例
- Qt5基本对话框
- Qt学习之路_13(简易俄罗斯方块)
- QT 中的生产者和消费者信号量
- QThread 使用 slot 槽函数