用WINSOCK建了个服务器端和客户端,为什么总有些文件传送得不完整呢?如WORD文档,由于传得不完整都打不开,有些图片只能显示一半,但有些文件又是好的。有什么有效的方法阻止这类情况发生吗?

解决方案 »

  1.   

    可以用PeekData方法来读数据,这样数据就不会从缓冲中删除。
      

  2.   

    能具体说说PeekData的方法如何使用吗?最好有个简单的小例子。
      

  3.   

    1、用TCP方式而不是UDP方式;
    2、发送文件前先发送文件的大小信息;
    3、视网络状况进行合理分包,如果网络不很快,建议每次发送数据不要超过8K;
    4、接收端每接到一个数据包后给发送端一个反馈,发送端接到该反馈后才发送下一个数据包,这可以有效地保证传输的完整性,但是也会使传输速度明显变慢;
    ......
      

  4.   

    呵呵~好久没发贴了!
    这都老问题了,我这几千的积分多半都来自这个问题,奇怪的CSDN,就是让这些问题一直重复呀重复!
    商业性质味重~~
      

  5.   

    建议先去查下Internet通信基础,然后再开始入手设计系统。鼓励LZ,这是一个很好的开始。
      

  6.   

    参考这两个C#程序(含注释)
    http://www.ligudan.com/source/cs/sys/net/tcpListener.cs.txt
    http://www.ligudan.com/source/cs/sys/net/tcpClient.cs.txt
    参考缓存应用(程序还没写完,基本结构就这样)
    http://www.ligudan.com/source/cs/sys/net/remoteCache/cacheServer.cs.txt
    http://www.ligudan.com/source/cs/sys/net/remoteCache/cacheClient.cs.txt
    参考其它应用
    http://www.ligudan.com/source/cs/sql/databaseMessage/messageServer.cs.txt
    http://www.ligudan.com/source/cs/sql/databaseMessage/messageClient.cs.txt
      

  7.   

    俺也来学习,是不是winsock连接断了才导致传输失败啊?
      

  8.   

    因为TCP是基于流而不是基于包的传输,所以必须按以下方法传输二进制数据
    发送方要先发送数据总长度,再发送数据;
    接收方收到数据长度先保存下来,然后缓存每次收到的包并检查所有收到的包的总长度直到和之前保存的数据长度一致即得到全部数据。
    一个连接一次只传输一个数据文件,不要并发传输多个文件,不然容易发生混乱。