問題是這樣的,一開始我用這段代碼把資料分包并發送,但除了末包,前面的全部回傳 -1。
后來發現分包發送之間加上間隔時間能有所好轉
但這個間隔時間我又把握不好,太短了依然會偶有失敗,太長了固然能全部發送成功,但我也不敢確定是否跟運行環境有關系,會不會換臺機器又不行了。
而且這樣也不符合我的業務需求,我的專案要求每15毫秒發一個資料包,如果每個資料包都要分包都要間隔時間,那就沒法做到15毫秒發送一次了
我的分包代碼在下面,求大佬幫我看看能如何優化,或者給點思路,感激不盡。
#define UDP_MAX_SIZE 65507
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; //資料幀在整幀的偏移
};
void MainWidget::sendPackData(QByteArray buffer,QString addr , quint16 port)
{
char *m_sendBuf = new char[1024*1000];
int size = buffer.size();
int num = 0;
int count = 0;
int endSize = size%UDP_MAX_SIZE;
if (endSize == 0) {
num = size/UDP_MAX_SIZE;
}
else {
num = size/UDP_MAX_SIZE+1;
}
while (count < num) {
memset(m_sendBuf, 0, 1024*1000);
ImageFrameHead mes;
mes.funCode = 24;
mes.uTransFrameHdrSize = sizeof(ImageFrameHead);
if ((count+1) != num) {
mes.uTransFrameSize = UDP_MAX_SIZE;
}
else {
mes.uTransFrameSize = endSize;
}
mes.uDataFrameSize = size;
mes.uDataFrameTotal = num;
mes.uDataFrameCurr = count+1;
mes.uDataInFrameOffset = count*(1024*1000 - sizeof(ImageFrameHead));
memcpy(m_sendBuf, (char *)&mes, sizeof(ImageFrameHead));
qint64 result = receiver->writeDatagram(m_sendBuf, mes.uTransFrameSize+mes.uTransFrameHdrSize,
QHostAddress(addr), port);
QTime dieTime = QTime::currentTime().addMSecs(15);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
count++;
}
qDebug("ok");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/56151.html
標籤:Qt
上一篇:as里報錯,咋改啊
