需要发送的内容是:
0X00  01 1E 0F 00 3C 00 00 ......
0X01  .......................................发送部分!
var a:array of  byte;
SetLength(a,180);a[0]:=$01;
a[1]:=$1E;
......
ClientSocket.socket.sendbuf(a,sizeof(a));
发现发送的数据变掉了,SNIFFER看到的是04 26 D0 00 FC F6 ...而且长度也变了,最后面有FF FF,奇怪了!
怎么会发送的内容会有变化呀?

解决方案 »

  1.   

     我知道了,要ClientSocket.socket.sendbuf(a[0],sizeof(a)); 
      

  2.   

    ClientSocket.socket.sendbuf(a[0],Length(a)); 
      

  3.   

    ClientSocket.socket.sendbuf(a[0],Length(a)); 
    发送第一个包多了 00 00;发送第二个包少了一断 90 6D AD 00 27 1F CA 6B;
      

  4.   

    辅助方法:
    function SendBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Boolean;
    var
      P: PChar;
      iLen,iSent: Integer;
    begin
      Assert(Buffer<>Nil);
      Assert(Socket<>Nil);
      Result := false;
      if Not Socket.Connected then Exit;
      P := Buffer;
      iLen := BufferLen;
      while iLen>0 do
        begin
          iSent := Socket.SendBuf(p^,iLen);
          if iSent <= 0 then Exit;
          Inc(p,iSent);
          Dec(iLen,iSent);
        end;
      Result := true;
    end;function RecvBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Integer;
    var
      P: PChar;
      iNeedRecv,iRecved: Integer;
    begin
      Assert(Buffer<>Nil);
      Assert(Socket<>Nil);
      Result := 0;
      if Not Socket.Connected then Exit;
      P := Buffer;
      iNeedRecv := BufferLen;
      while iNeedRecv>0 do
        begin
          iRecved := Socket.ReceiveBuf(p^,iNeedRecv);
          if iRecved <= 0 then Exit;
          Inc(Result);
          Inc(p,iRecved);
          Dec(iNeedRecv,iRecved);
        end;
    end;var a:array of  byte;
    iLen: Integer;iLen := 180; 
    SetLength(a,iLen); a[0]:=$01; 
    a[1]:=$1E; 
    ...... 
    if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit;
    //ClientSocket.socket.sendbuf(a,sizeof(a)); 
    if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit;接收端,也先接收一个integer(四个字节)作为实际长度,然后再根据该长度值继续接收数据,收完以后接着又是接收长度...数据...
      

  5.   

    服务器端不是不是我写的,其实和外挂差不多!
    我每次发送都sleep(2000);
    但是比较奇怪的是第一包多,第二包少,暂时测试的情况是这样的,楼上兄弟不知道,是否可以解释?
      

  6.   

    你把它转化为字符串发送呢?
    Socket.SendText
      

  7.   

    那你用我上面 的那个SendBuffer发送就是了.
      

  8.   

    除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.
      

  9.   

    除了SendStream会保证帮你发送完,其它几个SendBuffer/SendText都不保证.如何把array of  byte 转化为stream发送呢?
      

  10.   

    我以前都是用
    SendText发送的 也没遇到过这样的问题啊
      

  11.   

    SendText内部就是调用的SendBuf,你觉得你会特殊一点么?
      

  12.   

    sendStream用的就是类似我上面写的那个SendBuffer的机制。如果你觉得不麻烦,也可以创建一个TMemoryStream,然后再WriteBuf,然后再SendStream.
    function SendBuffer(Buffer:Pchar;BufferLen: Integer;Socket:TCustomWinSocket):Boolean;
    var
      P: PChar;
      iLen,iSent: Integer;
    begin
      Assert(Buffer<>Nil);
      Assert(Socket<>Nil);
      Result := false;
      if Not Socket.Connected then Exit;
      P := Buffer;
      iLen := BufferLen;
      while iLen>0 do
        begin
          iSent := Socket.SendBuf(p^,iLen);
          if iSent <= 0 then Exit;
          Inc(p,iSent);
          Dec(iLen,iSent);
        end;
      Result := true;
    end;
      

  13.   

    已经测试了
    if Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit;
     sleep(2000);
    两个包一个也没有发送!if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit; 
    //ClientSocket.socket.sendbuf(a,sizeof(a)); 
    if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit; 
    红色部分怎么回事情,没有理解!
      

  14.   

    已经测试了 
    if Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit; 
    sleep(2000);if Not SendBuffer(PChar(@b[0]),sizeof(b[0]),ClientSocket1.socket) then Exit; 
    sleep(2000); 
     
    两个包一个也没有发送! if Not SendBuffer(PChar(@iLen),sizeof(iLen),ClientSocket.socket) then Exit; 
    //ClientSocket.socket.sendbuf(a,sizeof(a)); 
    if Not SendBuffer(PChar(@a[0]),Length(a) * sizeof(a[0]),ClientSocket.socket) then Exit; 
    红色部分怎么回事情,没有理解! 
      

  15.   

    Length(a)是你的数组的元素个数。你现在使用的是Byte怕你以后改用WideChar,或者Smallint,或者Integer,或者其它甚至record等等之类的,所以增加了这样一种机制,能够检测出实际的字节数。
      

  16.   

    用你的方法测试,发送第一包的时候多了00 00,
    发送第二个包少了一段90 6D AD 00 27 1F CA 6B。两个包发送都不一样,COMMVIEW里面的内容是这样的!
    搞不清楚什么原因了!
      

  17.   

    0x0000   01 C9 00 45 00 01 1C 00-3A 33 ED 7E 00 00 00 00   
    0x0010   90 6D AD 00 5E 8A C8 6B-96 06 06 00 44 36 CA 6B   
    0x0020   96 06 06 00 01 00 00 00-90 6D AD 00 27 1F CA 6B  
    0x0030   F1 43 40 00 01 00   

    第二个包发送缺红色的内容!
                                      
      

  18.   

    可能需要用Sleep,并适当调整Sleep的时间。
      

  19.   

    我每次都SLEEP(2000)还是这样的呀,郁闷中。
      

  20.   

    SELEP(5000)也一样刚刚测试了一下,我研究一下:
    0x0000  01 C9 00 45 00 01 1C 00-3A 33 ED 7E 00 00 00 00  
    0x0010  90 6D AD 00 5E 8A C8 6B-96 06 06 00 44 36 CA 6B  
    0x0020  96 06 06 00 01 00 00 00-
    90 6D AD 00 27 1F CA 6B  F1 43 40 00 01 00  
    和上面的0x0010部分重复,是否是原因呀,另外一个包用你的方法测试会多一个00 00
      

  21.   

    晕倒...我告诉你的是:
    sizeof(b[0])*Length(b)
      

  22.   

    f Not SendBuffer(PChar(@a[0]),sizeof(a[0]),ClientSocket1.socket) then Exit; 
    sleep(2000); if Not SendBuffer(PChar(@b[0]),sizeof(b[0])*Length(b),ClientSocket1.socket) then Exit; 
    sleep(2000); 
    第二个用*length(b),第一个没有怎么解释呀?另外我发送固定长度也有问题呀!ClientSocket1.socket.SendBuf(a[0],148)  ; 
    sleep(5000); ClientSocket1.socket.SendBuf(b[0],54)  ; 
    sleep(5000); 和使用你的方法一样也是少14个