小弟在做通讯程序的客户端时遇到两个问题(假定服务段没有问题!)
1.服务端播发的数据记录个数为1千多条,可我只能获得前200~300条记录的数据(会变化) 
2.我的程序第一次接收数据包时能够正确接受(包头数据正确),第二次以后接过来的就始终是错误的数据有高人指点我,但是小弟对这方面机制不大了解,不知道如何设置缓冲区 ,以下是部分他的话,因为他比较忙,我不好意思老问他,希望这里有空的大侠予以帮助
“把接受缓冲开大点,可能你后面收的时候缓冲没清”
“第一次没有把缓冲区里数据接受完,要不停循环recv,直到收不到数据为止”接收数据代码:
type
DC_DATA=record
...
mydata: DC_DATA;implementation 
ServerSocket1.Socket.Connections[0].ReceiveBuf(mydata,sizeof(DC_DATA));

解决方案 »

  1.   

    1. 不知道你的DC_DATA是什么结构的。2. 如果你的代码假设了目前的ServerSocket1的数据接收缓冲区中正好有SizeOf(DC_DATA)个字节的数据。那么,可以告诉你,你的这个假设是错误的。3. 如果你的DC_DATA是个类似于Array[1..8192] Of Byte这样的结构,那么你应该判断ReceiveBuf实际接收到的数据有多少,即:var
      iReceived : Integer;......  iReceived := ServerSocket1.Socket.Connections[0].ReceiveBuf(mydata, sizeof(DC_DATA));如果iReceived等于SizeOf(DC_DATA),则有可能还存在着没有接收完的数据。4. 你对通讯的机制还没有摸清楚它的底细,所以这个代码问题多多。
      

  2.   

    DC_DATA=record
        var1: DC_HEAD;
        var2: DWORD;
        var3: WORD;
        var4: Integer;
        var5: Smallint;
        var6: Array of TMP_DATA;          //TMP_DATA又是另外一个记录结构,数量取决于var5
      end;
    我预先知道var5的个数,试过笨办法将实际接收字节数替代sizeof(DC_DATA)),可还是不能达到预期呵呵,摸清通讯机制肯定不是几天就可以的,小弟不是搞开发,做的只是验证程序,还望2楼的大侠多加帮助
      

  3.   

    按你这个DC_DATA的结构来看,你的接收代码得先把ServerSocket接收到的数据全部Receive到一个字节数组中,然后逐字节地处理、判断、填写到DC_DATA类型的变量的相应域中。通讯中的接收代码就是这么烦,比较难写的。
      

  4.   

    非常的感谢楼上的耐心解答
    偶现在最郁闷的地方就是无法接收到全部数据,无论是
    ServerSocket1.Socket.Connections[0].ReceiveBuf(mydata, sizeof(DC_DATA));
    或者
    ServerSocket1.Socket.Connections[0].ReceiveBuf(mydata, socket.ReceiveLength);
    还是
    ServerSocket1.Socket.Connections[0].ReceiveBuf(mydata, 100000);可实际接收的字节数最多只能是24760,不知道是不是受了什么机制所限(实际字节数为9万多)
      

  5.   

    受Socket通讯底层的限制。“接收到全部数据”在通讯中本身就是个错误的想法。
      

  6.   

    先谢谢两位谁能提供一下关于Socket通讯底层机制的资料介绍啊
      

  7.   

    请问我如何预定义BUFFER缓冲区的大小?
    指定一个长度吗?但是太大了浪费,太小了又可能不够,有更好的方法吗