Probier mal
sock.Send(buffer[0],length(buffer));
sock.Recv(buffer[0],8096);
Grund: Liest du aus buffer statt buffer[0], wird von der Adresse des Zeigers aus gelesen, nicht von der Adresse des ersten Elements aus. Gleiches beim Lesen. Allerdings ist dein Buffer zu klein um 8096 bytes zu speichern. Vorher solltest du mit
SetLength(buffer, 8096) für den nötigen Platz sorgen.
Wieso eigentlich 8096? ich hätte 8192 oder 4096 erwartet