我用IdTcpServer与VC通信,每次根据客户端(VC)的请求,数据库中查询数据,按照定义好的
的数据结构一条一条的发送给客户端,如果是数据很少的情况(4,5条)数据传输没问题,但是
一旦数据达到几千条数据时,就会发生数据丢包现象,
现在我就在发送的数据结构后加一个校验的数据位,服务器端发送数据,客户端接收数据,
根据校验位检验数据是否正确,错误,返回错误信息,服务器重新发送。正确就发送下一条数据
基本上就能解决问题,但是如果采取校验的方法,数据的传输速度很慢的,每发送一条数据,就得
等待客户端的校验信息,
我想知道各位有什么更好的方法了,大家交流一下

解决方案 »

  1.   

    但是我用delphi的IdTcpClient做客户端就没有问题,为何VC就有了
      

  2.   

    如果对方用了CSocket类来和你通讯,你肯定要挂,呵呵,
    MFC在CSocket类发的数据包里加了很多自己的东西
      

  3.   

    to:sunhuiNO1
        但是传输少量的数据就没有问题
      

  4.   

    TCP通讯应该同开发工具无关的.
    几千条记录数据量应该也不算大,
    你是怎么来保证发送与接收同步呢?
    你很多东西没有说清楚,不知道你具体怎么做的,
    只猜测你是发送和接收结构数据,
    没有用过VC的CSOCKET,不过我想它应该也有阻塞与非阻塞的区别..
    如果是ONREAD类似事件来接收,一定要把数据当成"流"来看待...
      

  5.   

    楼上的:
    1。客户端发出数据请求,从服务器端下载数据,数据按照定好的数据结构发送,
    2。VC端是使用CSOCKET,使用阻塞方式,
    3。我原来是服务器端从数据库中取出数据,就开始发送数据,直到数据发送完,就断开连接,这时客户端可能没有收完
      

  6.   

    发送的时候,每次SEND或WRITE都有返回值可以确定多少字节发出,
    这儿的判断是简单却重要,它可以确定到底有多少字节发送到对方的
    接收缓冲区(对方应用程序是否已经将其取出与否判断不到的)
    有这样的判断,发送端可以放心的断开连接。象上面这样排除发送端问题后,就把注意力集中在接收端。。
     
    没有用过VC的CSOCKET控件,你自己找找关于它的资料吧。
     
      

  7.   

    把sendbuffer size放大点试试
      

  8.   

    to starcbh:
       idTCPServer的sendbuffer size已经很大了,我试过的,不管是设置为1024还是其它的值,都不行的
      

  9.   

    肯定地说,tcp传送不会丢包,S实际发出多少,C就接收多少但在每次调用send的时候,他不一定会实际发出你指定的大小的包
    注意socket的底层 send调用是有返回值的,实际发出的字节在返回值里。如果你用CSocket配合CArchive ,那么也不会丢包我估计你是直接调用了CSocket的send方法,而这个方法实际是它的父类的方法
    你必须处理返回值来确定到底发出多少字节。俺用vc的socket发送过超过几十兆的东西,在局域网内,也曾经广域网上,都不会
    出现丢包的事情。