利用UDP发送图片是试验UDP传输视频流的基础。
【来源】http://blog.csdn.net/qq_28877125/article/details/69470139
UDP发送端
UDPSender.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-06T20:01:35
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = UDPSender
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUdpSocket>
#include <QFile>
#define TRAN_SIZE 1024;
struct ImageFrameHead {
int funCode; //!功能码
unsigned int uTransFrameHdrSize; //!sizeof(WIFI_FRAME_HEADER)
unsigned int uTransFrameSize; //!sizeof(WIFI_FRAME_HEADER) + Data Size
//数据帧变量
unsigned int uDataFrameSize; //数据帧的总大小
unsigned int uDataFrameTotal; //一帧数据被分成传输帧的个数
unsigned int uDataFrameCurr; //数据帧当前的帧号
unsigned int uDataInFrameOffset; //数据帧在整帧的偏移
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
QUdpSocket *m_udpSocket;
};
#endif // MAINWINDOW_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QDesktopWidget>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_udpSocket = new QUdpSocket(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
while(1) {
// QPixmap result = QPixmap();
// result = QPixmap::grabWindow(QApplication::desktop()->winId(), 0, 0, 800, 600); //抓取当前屏幕的图片
// result.save("D:\\LX\\Work\\Project\\802PC\\TcpServetTest\\802TCPServer\\eee.jpg");
QFile file("D:\\tempdata.jpg");
if (!file.open(QIODevice::ReadOnly))
return;
char *m_sendBuf = new char[1024];
int size = file.size();
int num = 0;
int count = 0;
int endSize = size%996;
if (endSize == 0) {
num = size/996;
}
else {
num = size/996+1;
}
while (count < num) {
memset(m_sendBuf, 0, 1024);
ImageFrameHead mes;
mes.funCode = 24;
mes.uTransFrameHdrSize = sizeof(ImageFrameHead);
if ((count+1) != num) {
mes.uTransFrameSize = 996;
}
else {
mes.uTransFrameSize = endSize;
}
//qDebug()<<size;
mes.uDataFrameSize = size;
mes.uDataFrameTotal = num;
mes.uDataFrameCurr = count+1;
mes.uDataInFrameOffset = count*(1024 - sizeof(ImageFrameHead));
file.read(m_sendBuf+sizeof(ImageFrameHead), 1024-sizeof(ImageFrameHead));
memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));
m_udpSocket->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize, QHostAddress("192.168.56.1"), 65522);
QTime dieTime = QTime::currentTime().addMSecs(1);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
count++;
}
file.close();
QTime dieTime = QTime::currentTime().addMSecs(10);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
//qDebug("ok");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
ui
UDP接收端
UDPReceiver.pro
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-06T20:10:32
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = UDPReceiver
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
udpthread.cpp
HEADERS += mainwindow.h \
udpthread.h
FORMS += mainwindow.ui
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "udpthread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void slotRecv(char *buf, int len);
private:
Ui::MainWindow *ui;
UdpThread *m_udpThread;
};
#endif // MAINWINDOW_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
udpthread.h
#ifndef UDPTHREAD_H
#define UDPTHREAD_H
#include <QThread>
#include <QUdpSocket>
struct ImageFrameHead {
int funCode; //!功能码
unsigned int uTransFrameHdrSize; //!sizeof(WIFI_FRAME_HEADER)
unsigned int uTransFrameSize; //!sizeof(WIFI_FRAME_HEADER) + Data Size
//数据帧变量
unsigned int uDataFrameSize; //数据帧的总大小
unsigned int uDataFrameTotal; //一帧数据被分成传输帧的个数
unsigned int uDataFrameCurr; //数据帧当前的帧号
unsigned int uDataInFrameOffset; //数据帧在整帧的偏移
};
class UdpThread : public QThread
{
Q_OBJECT
public:
explicit UdpThread(QObject *parent = 0);
~UdpThread();
protected:
virtual void run();
signals:
void sigRecvOk(char *buf, int len);
public slots:
void slotRecv();
private:
QUdpSocket *m_udpSocket;
char *m_buf;
};
#endif // UDPTHREAD_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_udpThread = new UdpThread;
connect(m_udpThread, SIGNAL(sigRecvOk(char*,int)), this, SLOT(slotRecv(char*,int)));
m_udpThread->start();
qDebug("OK");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slotRecv(char * buf, int len)
{
QPixmap pixmap;
pixmap.loadFromData((uchar*)buf, len, "JPG");
ui->label->setPixmap(pixmap);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
udpthread.cpp
#include "udpthread.h"
UdpThread::UdpThread(QObject *parent) :
QThread(parent)
{
m_buf = new char[1024*1024];
memset(m_buf, 0, 1024);
}
UdpThread::~UdpThread()
{
m_udpSocket->close();
delete m_buf;
}
void UdpThread::run()
{
m_udpSocket = new QUdpSocket;
connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(slotRecv()),Qt::DirectConnection);
qDebug()<< m_udpSocket->bind(QHostAddress::Any, 65522);
exec();
}
void UdpThread::slotRecv()
{
char *recvBuf = new char[1052];
memset(recvBuf, 0, 1052);
//qDebug("start");
while(m_udpSocket->hasPendingDatagrams()) {
memset(recvBuf, 0, 1052);
int size = m_udpSocket->pendingDatagramSize();
//qDebug()<<"size"<<size;
m_udpSocket->readDatagram(recvBuf, size);
ImageFrameHead *mes = (ImageFrameHead *)recvBuf;
//qDebug()<<mes->uDataFrameCurr<<mes->uDataFrameTotal;
if (mes->funCode == 24) {
memcpy(m_buf+mes->uDataInFrameOffset, (recvBuf+ sizeof(ImageFrameHead)), mes->uTransFrameSize);
if (mes->uDataFrameCurr == mes->uDataFrameTotal) {
qDebug("write");
emit sigRecvOk(m_buf, mes->uDataFrameSize);
}
}
}
delete recvBuf;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
ui
测试: