Nun ja, es erklärt warum das Showmessage zweimal kommt in sofern, dass du ja einen Empfangspuffer hast. Und der wird in n-Schritten gefüllt. D.h. bei jedem (asynchronen) Eintreffen von Daten wird die Ereignisbehandlung für das Eintreffen von Daten ausgelöst. Bei den ersten Bytes (die noch nicht vollständig Daten enthalten) -> Erstes ShowMessage, bei dem Rest -> zweites ShowMessage.
Da sleep aber glaube ich den ganzen Prozess lahm legt, solltest du lieber in einer Schleife warten, die auch weitere Prozessabläufe erlaubt.
Du solltest aber mal gucken, wieviele Bytes wirklich gelesen wurden (rückgabewert von socket.ReceiveBuf), wenn der sich von SizeOf(Daten) unterscheidet, liegt es wohl daran.
Delphi-Quellcode:
if Socket.ReceiveBuf(daten, SizeOf(daten)) <> SizeOf(daten) then
begin
ShowMessage('Aha, noch nicht alles da');
end;