rt

解决方案 »

  1.   

    主机发来一个数组
    var TP: Array [1..3] of Byte;
    .......客户端接收到这个数组 我用以下代码接收:
    var Tp: Array of Byte;
        i: Integer;
    begin
      i := ClientSocket.Socket.ReceiveLength;
      if i <> 0 then
      begin
        SetLength(Tp,i);
        ClientSocket.Socket.ReceiveBuf(Tp,i);  //此时TP接收到的东西都是0x00
      end;
    .........
    end;而将程序改写成这样:
    var Tp: Array[1..3] of Byte;  //假设对方发来的数据一定是3字节
        i: Integer;
    begin
      i := ClientSocket.Socket.ReceiveLength;
      if i <> 0 then
      begin
        
        ClientSocket.Socket.ReceiveBuf(Tp,3);   //此时的TP正好是主机发来的数据   
      end; 
    .........
    end;
      
    用setlength动态设置接收缓冲区长度和采用定长得到的数据不同,奇怪啊!!
      

  2.   

    变长数组与静态数组内存分配上,DELPHI中大不相同..
    与此相关,同理..
    STRING与静态CHAR数组内存分配区别原理是同上类似的..
    变你是变长数组时,
    var Tp: Array of Byte;
       bufsize:integer;
       rsize:integer;
     bufsize:=3000;//这大小并不太重要. rsize:=ClientSocket.Socket.ReceiveBuf(Tp,bufsize);
    改成
     rsize:=ClientSocket.Socket.ReceiveBuf(pbyte(Tp)^,bufsize);  //
      

  3.   

    另外,你程序上另一个问题..  i := ClientSocket.Socket.ReceiveLength;//这样取长度是不可靠的.1,传入缓冲区大小的参数建议用定值..
    2,必须取到返回参数(实际传输长度)加以判断.
      

  4.   

    to  halfdream(哈欠)   返回参数(实际传输长度)如何得到?
      

  5.   

    rsize:=ClientSocket.Socket.ReceiveBuf(pbyte(Tp)^,bufsize);  
    ~~~~~~\这是实际读取的长度。                      
      

  6.   

    至于bufsize 的值,我建议取个定值就行了.取值500,1000,4000,8000随便..
    可能不同取值对传输效率有细微影响,(可以根据自己程序网络情况进行测试)
    但对通讯可靠性并没有区别.写得稍完整些,比如象下面这样...这种方式仅限非阻塞SOCKET..var
      sBuf:string;
      iSize:integer;
      fo:TMemoryStream;
    begin
    ......
    .....
      fo:=TMemoryStream.Create;
      SetLength(sBuf,2000);  iSize:=Socket.ReceiveBuf(pchar(sBuf)^,2000);
      while iSize>0 do
      begin
        fo.Write(pchar(sBuf)^,iSize)
      end;
      .....
      

  7.   

    写得稍完整些,比如象下面这样...这种方式仅限非阻塞SOCKET..那我的是阻塞是SOCKET怎么办啊。
      

  8.   

    阻塞方式建议使用TWinSocketStream其实使用它,也只是在recv调用前select一下,不这样,阻塞方式里面还真不容易处理超时。