我是用两个千兆网卡连接,点对点传输数据,为了高速的传输,所以选择UDP协议
1. 大数据量的文件如何分块传输?我用的是Sendto函数,最大一次发送63KB。我现在用的方法是把要传输的文件读入内存,然后分成N个63KB发送,接收后再合成一个数据块。如果不考虑丢包的情况,这种合成后的文件肯定无法再打开。比如说视频文件。所以我想知道如何分块发送和接受大数据量的文件?并能保证文件好用。2. 如何保证UDP的传输速度最高效?我用的是Sendto 和 Recevfrom函数。发送数据后通过消息调用Recevfrom。Sendto的执行时间大概1.5ms,Recevfrom一般是0.03ms。感觉时间都浪费在Sendto上了。

解决方案 »

  1.   

    发送数据包的时候带上序列号(1 , 2 , 3)
    这样组包的时候按照序号来组包  
    发送的数据中最好在带上数据包的长度  这样可以更好的保证组包出来的文件和源文件一样
    CRC自己看着办  建议还是加上
      

  2.   

    计算机才不管你是什么东西  只要二进制是一样的  他就认为这两个文件时相同的 
    而你要做的  就是保证如何使传送过去的文件和发送的文件一样
    一个简单的strcut例子
    struct SendStruct 
    {
    ULONG ulSeq; //发送的序列号
    char szBuf[64 * 1024];
    DWORD dwLen; //数据包中有效数据的长度  -- szBuf中的长度
    DWORD dwCRC; //校验  如果初期有难度  可以不用校验  
    };
    //这个结构可以多线程发送数据提高速度
    //组包的时候就根据dwLen的长度读取szBuf中的内容  然后写入到文件中
    //很基础的例子  免得贻笑大方
      

  3.   

    谢谢各位的回答。
    还有Sendto函数我试了一下,最多可以发送63K的数据,千兆网卡如何能体现出性能的优势呢?
      

  4.   

    既然需要安全可靠的连接,当然是用TCP好了..........UDP适合穿不需要验证的数据....................transmitfile速度不错.......
      

  5.   

    这样做是最佳效果: 包加序号,UDP 狂发。客户端, 根据序号组合包 ,掉包不管, 但纪录掉包率掉包序号,用HTTP下载掉包的包(根据重发请求次数), 当然有个平衡算法原则。 就是更具掉包率 和HTTP的请求率去智能平衡。也就是不考虑拥塞的滑动策略, 从快往慢去滑, 不是TCP的慢启动从慢往快滑。 比TCP快。 
      

  6.   

    1. 大数据量的文件如何分块传输?我用的是Sendto函数,最大一次发送63KB。我现在用的方法是把要传输的文件读入内存,然后分成N个63KB发送,接收后再合成一个数据块。如果不考虑丢包的情况,这种合成后的文件肯定无法再打开。比如说视频文件。所以我想知道如何分块发送和接受大数据量的文件?并能保证文件好用。 
    你保证是63kb一次,保证按顺序发,并按顺序接收,合成后的文件不可能打不开。按二进制读,二进制写。
    不可能打不开
      

  7.   

    http://topic.csdn.net/u/20091130/12/0ea2c403-b7bd-4b27-bc17-6e5b5cd4cd55.html?93621
      

  8.   

    很是奇怪,我发送了一个Data.txt文件,文件大小为1831字节,接收后,内容居然都是乱码。
    大概代码如下:
    发送端: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();
    }请大家指教问题的原因?
      

  9.   

    再有一个问题:我需要修改MTU吗?如何修改呢?MTU会影响传输速度吗?
      

  10.   

    Windows下, 如果使用socket(非Raw Socket), 采用UDP协议()发送数据,
    不可能达到很大吞吐量, 也就不可能实现“高速”传输所谓的“大量的”数据了。因为使用UDP时的socket有一个发送最大值限制, 也就是65507. 一次只能发这么大。建议使用TCP。
      

  11.   

    UDP,数据包是无序的,逻辑分包,更是如此,只能加序号,并且如果接收完之后,要把丢失的序号包,重新传递,直至完整。但这样做已经丧失了部分性能
      

  12.   

    你最好dump出文本文件看看,是否包乱序
      

  13.   

    UDP需要自己维护发送的包的顺序吧
      

  14.   

    而且这么大的数据用tcp所带来的开销是不是可以忽略了啊
      

  15.   

    由于网络原因,接收到的UPD包不一定是有序的。
      

  16.   

    接收端: char* recBuf = new char[1831]; 
    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(); 

      

  17.   

    设计了一个struct来传输多个txt文件,每个文件的大小为64512。收到后为什么txt文件的第一行是乱码,其余部分都没问题。
    struct ReceiveStruct
    {
    int iNumber;
    DWORD iDataSize;
    char pData[64512];
    };
      

  18.   

    楼上这么多高手都发表技术方面的看法了,我自己也是个半吊子,就不从技术方面来说了。
    我只是很纳闷。
    “为了高速的传输,所以选择UDP协议”
    你要传文件,却用UDP协议,想不通。可以说TCP对于初我们这些学者来说就是专门用来传文件的。你却用UDP。
    TCP现在的效率已经很高了,对传文件来说根本不存在什么效率问题,UDP是用来传输实时数据的,比如视频,语音等。
    请问楼主你丢包问题怎么解决?貌似现在能完美解决UDP丢包问题的少的很。即使实现了,大多数效率还不如TCP。如果你执着要用UDP,就等着尝苦头吧。保准下个来问的问题就是怎么解决丢包问题了。
      

  19.   


    你从哪里看到UDP一定能高速传送?
      

  20.   

    设计了一个struct来传输多个txt文件,每个文件的大小为64512。收到后为什么txt文件的第一行是乱码,其余部分都没问题。 
    struct ReceiveStruct 

    int iNumber; 
    DWORD iDataSize; 
    char pData[64512]; 
    };
    这个问题是什么原因呢?还请各位高手指点