客户端用TTcpClient发送一个MemoryStream,服务端用TServerSocket接收,发送没问题,服务端也接收到了,就是无法读出MemoryStream的内容。我在客户端和服务端都定义了一个结构,放在MemoryStream里。公共的结构:  RefreshLink_Rec = record
    TheType : Integer;
    ClientIP: string[15]; 
  end;
客户端发送:procedure TForm1.btn1Click(Sender: TObject);
var
  bodyInfo: RefreshLink_Rec;
  m: TMemoryStream;
begin
  m := TMemoryStream.Create;
  try
    if not ClientSocket1.Active then
    begin
      ClientSocket1.RemoteHost := '192.168.1.3';
      ClientSocket1.RemotePort := '1013';
      ClientSocket1.Active := True;
    end;    bodyInfo.TheType := 1234561;
    bodyInfo.ClientIP := '127.0.0.11';    m.Write(bodyInfo,sizeof(bodyInfo));    ClientSocket1.SendBuf(m,m.Size);
  finally
    m.Free;
  end;
end;
服务端接收:procedure TForm1.ServerSocketMainClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  BufferLen: Integer;
  bodyInfo: RefreshLink_Rec;
  mt: TMemoryStream;
begin
  BufferLen := Socket.ReceiveLength;
  mt := TMemoryStream.Create;
  try
    memo1.Lines.Add(IntToStr(mt.Size));//这里MEMO里显示的是0
    Socket.ReceiveBuf(mt,BufferLen);
    memo1.Lines.Add(IntToStr(mt.Size));//到这里就报错了,改用mt.Read()也一样报错,错误信息如下
{
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00453BA9 in module 'Project1.exe'. Read of address 00000062'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------}
  finally
    mt.Free;
  end;
end;
请教有什么地方有问题

解决方案 »

  1.   

    Socket.ReceiveBuf(mt,BufferLen);加个mt.position=0看看
      

  2.   

    加过的,但是mt.position := 0这句也是报错
      

  3.   

    procedure TForm1.ServerSocketMainClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      BufferLen: Integer;
      bodyInfo: RefreshLink_Rec;
      mt: TMemoryStream;
    begin
      BufferLen := Socket.ReceiveLength;
      mt := TMemoryStream.Create;
      try
        memo1.Lines.Add(IntToStr(mt.Size));//这里MEMO里显示的是0    mt.SetSize(BufferLen);
        Socket.ReceiveBuf(mt.Memory,BufferLen);    memo1.Lines.Add(IntToStr(mt.Size));//到这里就报错了,改用mt.Read()也一样报错,错误信息如下
     finally
        mt.Free;
      end;
    end;
      
      

  4.   

    非常感谢楼上兄弟,我按楼上兄弟的方法试了一下,接收没有出错了,但是却无法从流里读出发送的内容,读出来的全是乱码,后面的代码如下:procedure TForm1.ServerSocketMainClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      BufferLen: Integer;
      Buffer: Pointer;
    begin
      BufferLen := Socket.ReceiveLength;  mt := TMemoryStream.Create;
      mt.SetSize(BufferLen);
      Socket.ReceiveBuf(mt.memory^,BufferLen);{这里稍微改了下,楼上兄弟可能笔误了}
      mmo1.Lines.Add(IntToStr(mt.Size));
      mt.Position := 0;  while mt.Position < mt.Size do
      begin
        mt.Read(bodyInfo,SizeOf(bodyInfo));
        mmo1.Lines.Add(IntToStr(bodyInfo.TheType)+'   '+bodyInfo.ClientIP+'   '+bodyInfo.ClientMAC);{这里显示的不是发送的bodyInfo.TheType := 1234561 和 bodyInfo.ClientIP := '127.0.0.11',而是13968844   ?}
      end;
    end;
    还请指教还有哪里不对啊?
      

  5.   


    客户端发送: Delphi(Pascal) code
    procedure TForm1.btn1Click(Sender: TObject);
    var
      bodyInfo: RefreshLink_Rec;
      m: TMemoryStream;
    begin
      m := TMemoryStream.Create;
      try
        if not ClientSocket1.Active then
        begin
          ClientSocket1.RemoteHost := '192.168.1.3';
          ClientSocket1.RemotePort := '1013';
          ClientSocket1.Active := True;
        end;    bodyInfo.TheType := 1234561;
        bodyInfo.ClientIP := '127.0.0.11';    m.Write(bodyInfo,sizeof(bodyInfo));    ClientSocket1.SendBuf(m.memory^,m.Size);
      finally
        m.Free;
      end;
    end;