我是用两个千兆网卡连接,点对点传输数据,为了高速的传输,所以选择UDP协议
1. 大数据量的文件如何分块传输?我用的是Sendto函数,最大一次发送63KB。我现在用的方法是把要传输的文件读入内存,然后分成N个63KB发送,接收后再合成一个数据块。如果不考虑丢包的情况,这种合成后的文件肯定无法再打开。比如说视频文件。所以我想知道如何分块发送和接受大数据量的文件?并能保证文件好用。2. 如何保证UDP的传输速度最高效?我用的是Sendto 和 Recevfrom函数。发送数据后通过消息调用Recevfrom。Sendto的执行时间大概1.5ms,Recevfrom一般是0.03ms。感觉时间都浪费在Sendto上了。
1. 大数据量的文件如何分块传输?我用的是Sendto函数,最大一次发送63KB。我现在用的方法是把要传输的文件读入内存,然后分成N个63KB发送,接收后再合成一个数据块。如果不考虑丢包的情况,这种合成后的文件肯定无法再打开。比如说视频文件。所以我想知道如何分块发送和接受大数据量的文件?并能保证文件好用。2. 如何保证UDP的传输速度最高效?我用的是Sendto 和 Recevfrom函数。发送数据后通过消息调用Recevfrom。Sendto的执行时间大概1.5ms,Recevfrom一般是0.03ms。感觉时间都浪费在Sendto上了。
这样组包的时候按照序号来组包
发送的数据中最好在带上数据包的长度 这样可以更好的保证组包出来的文件和源文件一样
CRC自己看着办 建议还是加上
而你要做的 就是保证如何使传送过去的文件和发送的文件一样
一个简单的strcut例子
struct SendStruct
{
ULONG ulSeq; //发送的序列号
char szBuf[64 * 1024];
DWORD dwLen; //数据包中有效数据的长度 -- szBuf中的长度
DWORD dwCRC; //校验 如果初期有难度 可以不用校验
};
//这个结构可以多线程发送数据提高速度
//组包的时候就根据dwLen的长度读取szBuf中的内容 然后写入到文件中
//很基础的例子 免得贻笑大方
还有Sendto函数我试了一下,最多可以发送63K的数据,千兆网卡如何能体现出性能的优势呢?
你保证是63kb一次,保证按顺序发,并按顺序接收,合成后的文件不可能打不开。按二进制读,二进制写。
不可能打不开
大概代码如下:
发送端:CString szTempFile = _T("F:\\program\\Temp Data\\data.txt");
CFile file;
file.Open(szTempFile, CFile::modeRead);
int ifileLen = file.GetLength();
char* pImage = new char[ifileLen];
file.Read(pImage, ifileLen);
file.Close();
int iLen = sendto(m_ClientSocket,(char*)&pImage,ifileLen,0,(struct sockaddr *)&Rec_addr,addrlen);接收端: char* recBuf = new char[1831];
int iLen = recvfrom(m_ServerSocket, recBuf,1831,0,(struct sockaddr *)&from_addr, &addrlen);
if(iLen==1831)
{
CFile writefile;
writefile.Open("F:\\program\\Temp Data\\temp.txt",CFile::modeCreate|CFile::modeWrite);
writefile.Write(recBuf,1831);
writefile.Close();
}请大家指教问题的原因?
不可能达到很大吞吐量, 也就不可能实现“高速”传输所谓的“大量的”数据了。因为使用UDP时的socket有一个发送最大值限制, 也就是65507. 一次只能发这么大。建议使用TCP。
memset(recBuf,0,1831);
int iLen = recvfrom(m_ServerSocket, recBuf,1831,0,(struct sockaddr *)&from_addr, &addrlen);
if(iLen==1831)
{
CFile writefile;
writefile.Open("F:\\program\\Temp Data\\temp.txt",CFile::modeCreate|CFile::modeWrite);
writefile.Write(recBuf,iLen/*1831*/);
writefile.Close();
}
struct ReceiveStruct
{
int iNumber;
DWORD iDataSize;
char pData[64512];
};
我只是很纳闷。
“为了高速的传输,所以选择UDP协议”
你要传文件,却用UDP协议,想不通。可以说TCP对于初我们这些学者来说就是专门用来传文件的。你却用UDP。
TCP现在的效率已经很高了,对传文件来说根本不存在什么效率问题,UDP是用来传输实时数据的,比如视频,语音等。
请问楼主你丢包问题怎么解决?貌似现在能完美解决UDP丢包问题的少的很。即使实现了,大多数效率还不如TCP。如果你执着要用UDP,就等着尝苦头吧。保准下个来问的问题就是怎么解决丢包问题了。
你从哪里看到UDP一定能高速传送?
struct ReceiveStruct
{
int iNumber;
DWORD iDataSize;
char pData[64512];
};
这个问题是什么原因呢?还请各位高手指点