对了,我的源代码在这里,大家帮我改改,谢谢了
http://61.50.146.143/fs/fserver.rar

解决方案 »

  1.   

    怎么加校验机制,我传小文件没问题呀,能不能给我发一个完整的异步传输文件的源代码,谢谢
    [email protected]
      

  2.   

    晕,TCP协议本来就是提供可靠的并且无差错的通信服务,适用于小报文的传输,大数据量用UDP
      

  3.   

    为什么都喜欢用TCP传文件。
      

  4.   

    传送文件当然需要使用TCP啦,UDP是不可靠协议用来传送文件更加不安全不稳定。
    大文件出现问题我估计是你在发送数据块分割的时候,数据块边界出现了问题。
    另外你在TCP连接后双方接收数据的时候注意字符编码接收问题。
      

  5.   

    我的理解是这样的
    传输大的文件的时候,开始的时候(较短的一段时间之内)不会出现乱码的现象,后面就出现了乱码的现象,就是说,持续不断的传输大量数据,导致网络繁忙,比如N个循环传一个100B的buffer,后面由于网络忙,socket就会将它分为两个(或者更多)的小包(即报文)进行传输,而在客户端接收这些小包的顺序并不是按照从前到后的顺序,即,先收到的包就先拆开,也就导致了在客户端接收数据出现了乱码的问题
      

  6.   

    那个是UDP的问题。TCP有机制来保护。建议lz研究一下FTP之类的方式来传输大文件,单纯TCP的方式原理上也不会出问题,只是没人有时间看你的代码错在哪里。
      

  7.   

    不过是网络的问题,不是tcp的问题非对称丢包特性对TCP吞吐量的影响 
    http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece76310478027474380146b80c7150892d213cf3101061471e3cc70745713d3b22d3b1ccf1e1eb7b0706f44426be6fdb9ea57aefad97949f94523706bc41746c75cf28b102a8771d24de9de0e97bee741e0b9a2d1c82022&p=876dc64ad7934ea81efe88127f&user=baidutcp也会丢包,
    2. 非对称信道对TCP产生影响的方面 

    2) 增加前向链路突发.由于受拥塞窗口的限制,TCP只有在收到新的有效确认时,
    才能发送新的数据包.再回传路径带宽不足或高误码率是,很容易发生确认包丢
    失.而本该发送的新数据,由于确认包丢失则不能发送.当后续确认到达源端时,
    原来待发的数据就会和新确认所对应的数据包同时发出,造成突发.当丢失较多
    的确认包后有效确认到达时,源端就有可能在短时间内发送过多的数据,造成前
    向链路缓存溢出,产生丢包. TCP会不会丢包?
    http://bbs2.chinaunix.net/thread-610986-1-1.html
    至于丢包,是因为网络曾或者数据链路层或者物理层造成的。如果是因为TCP协议本身的问题,接收端会发送icmp差错报告,报告发送端TCP协议不可达.
    如果包没有按顺序到达,譬如编号1,5,而没有收到2,3,4,应用程序直到2,3,4都到达的时候才会读取。
    对于已经建立的连接,如果长时间没有数据交流,也会终止链接,释放tcp协议所开辟的缓存。【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? http://www.cnblogs.com/xuyuan77/archive/2008/06/11/1217416.html
    4 楼youngwhz(sunbird)回复于 2003-09-23 13:58:19 得分 20
    比如发送文件。记得有人提过可能会发生什么堆栈溢出。??? 
    TCP传输是可以保证数据交换的可靠性的,但这是指一方的主机将数据正确的传输到目标机器中,目标机器的协议栈的堆栈是有一定限制的,如果在目标机器中不及时处理接收到的数据,有可能堆栈会溢出!而这种溢出并不是因为TCP协议本身,而是因为系统的IP协议栈的缓冲区溢出造成! 
      

  8.   

    tcp也会丢包 不过是网络的问题,不是tcp的问题 
      

  9.   

    乱码跟tcp协议无关,本身tcp提供的就是可靠连接,需要三次握手,需要保证数据传输完整性。应该是你接收端代码问题,比如过多的数据流导致的问题
      

  10.   


    一次发送数据并不是一个数据包,Tcp没有数据包的概念,是基于流的用流操作就可以了
    while(true)
    {
    receivedLength = socket.Recive(bytes, 0, length);
    if(receivedLength == 0) break;
    fs.Write(bytes, 0, receivedLength);
    }
    fs.Close();
    ShowMessage("传输完成");
      

  11.   

    分块,每块加上标识这块属于哪个位置,数据大小。
    我最近做了个UDP的。
      

  12.   

    1楼给的源代码我下载不了。不知道楼主用的是不是VS2008,我有个VS2008下的文件传输代码可供参考,在我的上传资源里。
      

  13.   


    兄弟是否可以说说你的UDP呢?
    方便的话贴代码出来大家瞧瞧?
      

  14.   


    似乎TCP是有校验的,这种丢包现象几率很小。
      

  15.   

    楼主给的源码下载不了。不过TCP socket在接收的时候有可能会有粘包现象,不知道楼主有没有自己把数据切块,并且记录每次发送的数据包的长度。如果单纯把数据直接发送出去,然后直接接收,而不判断长度,有可能在重新组包的时候出错
      

  16.   

    http://download.csdn.net/detail/czwwzc0184211/4030080   这里有Tcp传送文件的小例子!
    解决了Tcp粘包问题,无论发大文件,小文件都没问题!可以看看!