关于udp接收缓存问题

Allensb 2016-10-20 05:04:04
开发平台 : linux
开发工具 : Qt
版 本 :Qt Creator 1.3.1

我的大体思路是:发送端先发送自己的 IP及port 然后发送文件名 最后发文件(会按包发送)。接收端依次接收,并写文件。

现在主要问题是:发送端可以正常发送,接收端也可以正常接收,但是速度只能达到10M/S左右。如果发送端在发送稍微快一点,就会出现丢包。我想用recv-> setReadBufferSize() 增大接收端缓存,可惜没有什么作用。
本想试试receiver->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,) 奈何版本太低不支持。
初学Qt 望大牛指点,小弟不胜感激。附上接收文件与发送文件的部分代码。
void Widget::getFile()//收取文件
{
QString info;
QFile destFile(recvFileName);
if (!destFile.open(QIODevice::WriteOnly))
QMessageBox::about(this,"提示","文件写入出错");
if(recv->hasPendingDatagrams())
{

QByteArray buf;
QDataStream in(&buf, QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_6);

buf.resize(recv->pendingDatagramSize());
recv->readDatagram(buf.data(), buf.size());
// qDebug() << buf.size();
in >> info;
if(isFinished(info) || (bytesReceived == recvTotalBytes))
{
destFile.write(bufe);
recvTimer->stop();
updateInfo();
ui->saveas_3->setText("接收完成");
count =0;
gn = 0;
bufe.clear();
bytesReceived = 0;
recvTotalBytes = 0;
recvCount = 0;

//timer1.stop();
}
else
{
count ++;
bufe += buf;
bytesReceived += buf.size();
}
}
QString runpath = QCoreApplication::applicationDirPath();
ui->saveas_2->setText(runpath);

}

void Widget::putFile()//发送文件
{
sendInfoTimer->start(1000);
while(!flagOver){
QByteArray dagram;
dagram = sendByteA.mid((i*64512),64512);//每包以60 * 1024字节发送
sender->writeDatagram(dagram,dagram.size(),QHostAddress::Broadcast,sendPort);
qDebug() << dagram.size();
i++;
bytesWritten +=dagram.size();
qDebug() << bytesWritten;
if(i == sendCount)//如果发送包数与应发包数相同,结束
flagOver = true;
mysleep(4);
}
sendInfoTimer->stop();
sendUpdateInfo();
QDataStream sendout(&outBlock,QIODevice::WriteOnly);
sendout.setVersion(QDataStream::Qt_4_6);
QString sendInfo = "stop**";//发送结束标示
sendout<<sendInfo;
sendout.device()->seek(0);
sender->writeDatagram(outBlock,outBlock.size(),QHostAddress::Broadcast,sendPort);
ui->label_2->setText("发送完成");
sendHost = new QHostAddress;
bytesWritten = 0;
i=0;
flagOver = false;
timer1.stop();
}
...全文
888 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little柯南 2016-11-04
  • 打赏
  • 举报
回复
另外,udp传输,你最好设置包头,告诉是第几帧数据,接收方可以回执每次将绑定接到第几帧的标识数据发出去,发送方收到接收方的回执再发送下一帧
诺水城子 2016-11-04
  • 打赏
  • 举报
回复
网络传输用独立的线程,接收端的数据处理速度必须要跟上,我看你接收代码。每次接收都会去打开文件,是比较耗时的,可以优化
捣蛋不对 2016-10-26
  • 打赏
  • 举报
回复
没类似经验,但认为这种和GUI无关的数据传输 还是弄到独立的工作线程中合适 一来防止GUI主进程被阻塞 二来达到提高速度的目的
Allensb 2016-10-26
  • 打赏
  • 举报
回复
引用 3楼捣蛋不对 的回复:
没类似经验,但认为这种和GUI无关的数据传输 还是弄到独立的工作线程中合适 一来防止GUI主进程被阻塞 二来达到提高速度的目的
嗯嗯。已经使用线程,但是速度还是不太满意。确保接收无误的话只能达到40m/s。谢谢你的回复。
Allensb 2016-10-26
  • 打赏
  • 举报
回复
引用 5楼Little柯南 的回复:
单向传输,比如你设定端口号:9999,然后QTcpServer监听这个,有新链接则开始给其发文件。发的过程按照你的每次读取字节; 接收方,设定连接服务器方的ip与端口,你尝试连接服务器,连接成功只负责接收就行了
谢谢你的回复,由于项目条件,所以不能使用tcp,因为tcp需要建立连接的,我使用的单向网卡传输是根本pin不通的。你的思路我会借鉴的。谢谢!
Little柯南 2016-10-26
  • 打赏
  • 举报
回复
单向传输,比如你设定端口号:9999,然后QTcpServer监听这个,有新链接则开始给其发文件。发的过程按照你的每次读取字节; 接收方,设定连接服务器方的ip与端口,你尝试连接服务器,连接成功只负责接收就行了
Little柯南 2016-10-26
  • 打赏
  • 举报
回复
你的设计思路我完全做过,发文件,你又怕发送不完整什么的,那就是用TCP传输,保证你传输的完整、完全ok。是不是使用多线程看你的文件多大,小的话用不用都没事,大的话用多线程。另外,Qt的话,如果你条件允许,你就使用Qt4.8.6,这是Qt4最后版本相当稳定,如果使用Qt5的话任意一个版本都行。
Allensb 2016-10-20
  • 打赏
  • 举报
回复
突然想到如果这样不知是否可应: 我发送文件的时候在启一个线程,把它的总包数分为两个部分发送。接收端接收到的两部分然后在拼接 不知道可以不。。。
Allensb 2016-10-20
  • 打赏
  • 举报
回复
由于是单向网卡传输,所以不得不使用UDP。希望大家多多指点。

16,233

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧