Search code examples
delphitcpmemorystream

Access violation to server in Delphi


Was trying to write simple client and server recieveing/sending data through TMemoryStream. When I push button in client btnTestClick it apperas an error Access violation at address 005D5581 in module 'Client.exe'. Write of adress 00000000. What I do wrong?

Btw client server connection works okay I thin cuz IdTCPClient1Connected function is writing 'Client Connected!'.

Client code

procedure TForm1.btnTestClick(Sender: TObject);
var
  msRecInfo: TMemoryStream;
  arrOf: array of Integer; i:integer;
begin
  for i := 0 to 10 do
    arrOf[i]:=random(100);

  msRecInfo:= TMemoryStream.Create;

  try
    msRecInfo.Write(arrOf, SizeOf(arrOf));
    idTCPClient1.IOHandler.Write(msRecInfo);
  finally
     msRecInfo.Free;
  end;

end;

end

Server code

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
   msRecInfo: TMemoryStream;
  arrOf: array of Integer; i:integer;
begin
  msRecInfo:= TMemoryStream.Create;
  try
    AContext.Connection.IOHandler.ReadStream(msRecInfo, -1, False);

    msRecInfo.Position := 0;
    msRecInfo.Read(arrof, SizeOf(arrof));
  finally
    memo1.Lines.Add(IntToStr(arrOf[1]));
    msRecInfo.Free;
  end;
  //AContext.Connection.IOHandler.ReadStream(msRecInfo, SizeOf(arrOf));
  //msRecInfo.Read(arrOf, sizeOf(arrOf));
end;

Solution

  • You start writing into a dynamic array before you've allocated any elements for it. Dynamic arrays do not automatically grow like you might be used to from some other languages. You need to set their lengths first.

    If you haven't set the length of a dynamic array, then it will just be a null pointer, which explains why you get an access violation at address 0.

    Change your btnTestClick method like so:

    var
      msRecInfo: TMemoryStream;
      arrOf: array of Integer;
      i: integer;
    begin
      SetLength(arrOf, 11);
      for i := 0 to 10 do
        arrOf[i] := Random(100);