Cześć, trop masz dobry. Owszem błąd pojawia się przez to, że połączenie zostaje zamknięte w trakcie działania tej funkcji TCP Read w dolnej pętli. Dlaczego tak się dzieje pomimo, że dodałeś opóźnienie ? Otóż Twoja funkcja read działa w trybie Standard (tryb ustawiamy tym enumem podpiętym do funkcji) i w tym trybie funkcja czeka aż nadejdzie zadeklarowana ilość bajtów lub minie czas tzw.timeout, który również możemy zadeklarować. W tym wypadku nie ma deklaracji i jest to domyślnie 25 sekund. Dlatego Twoje 2 sekundowe opóźnienie nic nie dało. Oczywiście możesz zmienić timeout w TCP Read na krótszy jednak w tym trybie możesz mieć ciągle błąd związany z nieodczytaniem wszystkich bajtów. Deklarujesz ich do oczytania 80 a ile wysyłasz nie wiemy ale zakładam, że nie taką ilość ;)
Najprościej zmienić tryb funkcji TCP Read na Immediate i wtedy program powinien zadziałać. Mam jednak obawy co do całej konstrukcji - czy koniecznym warunkiem jest zestawianie połączenia za każdym razem kiedy chcesz coś wysłać ?

Pewne funkcje można by wyrzucić poza pętle i trochę zmienić "architekturę". Jeżeli masz jeszcze jakieś pytania lub chciałbyś coś tu przebudować to dawaj znać !