procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
   buffer:array [0..63] of byte;
   len:integer;
begin
  len:=64;
  ClientSocket1.socket.receivebuf(buffer,len);
  AnalyzeFrame(buffer,len);
end;
以上代码是我以前写的,现在发现每次不只收到64字节的数据。怎么取这个Len和这个buffer大小要怎么定义呢?

解决方案 »

  1.   

    循环收取,直到等于整个长度,先把整个长度传过来,根据这个长度去循环收取,如果总长100,你buffer是64,那就要收两次
      

  2.   

    假设服务端发来的数据的长度一定在某个什么范围,例如楼主所设置的不大于64,是十分不合适的。如果服务器发过来的包大于64Byte,你的处理就有问题了。首先一个,单纯说传过来的数据长度是没有意义的,有意义的是发过来的数据根据通信协议分段后形成的一个个包的长度。这是通信协议要约定的,楼上有同志说过了。所以,通信程序的正确做法应该是:
    1、按照一楼的说法,循环收取,来者不拒,先收到一个buffer当中;
    2、对Buff进行通信协议的扫描,例如什么包头部尾部,或者长度等,发现了合格的包,则处理,否则继续等待收齐。
    3、1和2之间的交互写作可以定时,也是1调用2,自己灵活掌握。
      

  3.   


    procedure TForm1.ClientSocket1Read(Sender: TObject;  Socket: TCustomWinSocket);
    var
      iLength: Integer;
      ABuffer: array of Byte;
    begin
      iLength:= Socket.ReceiveLength();
      SetLength(ABuffer, iLength);
      Socket.ReceiveBuf(ABuffer[0], iLength);
      AnalyzeFrame(ABuffer, iLength);
      SetLength (ABuffer, 0);
    end;