我想用udp socket来传输大文件(大于64k),因为一个udp包的最大数据长度是64k.请问我需不需要再传输的时候,将文件分成64k一下的包,然后再接收端组包?有人说不用,socket会自动的将大于64k文件分成几个udp包,接收端自动的将几个udp包组成一个文件.请问请问我需不需要再传输的时候,将文件分成64k一下的包,然后再接收端组包?

解决方案 »

  1.   

    帮你顶。
    应该看你用什么层次的编程接口吧。
    记得《windows网络编程》里面 是要自己分的。
    大概的算法是这样:
    #dedinf MAXBUF 4000char buf[MAXBUF];
    //fill buffer with  nlen byte
    while(nlen>0){
       int n =send(buf,sock.....);
       nlen-=n;
       buf+=nlen;
    }
      

  2.   

    在www.vckbase.com里面搜索一下 我下载了 但在家里面电脑里 公司里面没有
      

  3.   

    udp是不可靠的协议,64K显然要自己分包了,并要采用适当的组包算法,可以参考TCP的实现。简单的说,最好1个包1K或0.5K,发包过程可以如下:
    typedef struct _Data
    {
    int   iType;    // 包的消息类型
    int   iNum;     // 包的编号
    char* caData;   // 实际发送的数据
    }DATA;发包的时候,指定一种数据类型,如:0;
    依次把包分成64份,并发出;
    发送完后,可以用另一种消息类型,如:1来标志包已全部发完;
    接收端根据编号组包;
    如果有丢包,通知发送放重新发送;
    循环上述过程... ...
      

  4.   

    理论上你可以不组包,但是这个肯定不行。
    因为udp是不可靠的协议, 接收的时候,是按包接收,而这个包,是driver 发的包,
    如果你发的包大于driver 的buffer, 那它会自动分包,如果你 有一个收不到,你就不知道是那个了。
    特别是在internet 的状况下 ,丢包机会会更大
      

  5.   

    一般来说,文件的传输是需要可靠的传输的,因为文件中少了1个字节都是不行的。所以建议你使用TCP传输,而不要使用UDP进行传输。并且使用TCP比UDP方便一些(从写程序的角度来说)。
    不过如果你的UDP传输也是可靠的(需要自己实现),那也可以使用UDP。但是麻烦一些。
      

  6.   

    谢谢各位的回答。程序的通讯因为涉及和其他人的接口,现在他们都是用udp实现的。所以最好用udp实现。我和其他模块之间是在局域网中通讯,只要文件传输中包的丢失率不高,文件是可以丢失的。由于本人对socket通讯不太熟。请大家根据我的提示再帮我。考虑考虑。
      

  7.   

    首先解决,packet size的问题,
    然后考虑用UDP实现可靠文件传输
    http://hackangel.go1.icpcn.com/lilisoft/UDPTrsmtFile.rar
    这个是个例子