Он почему то выполняет цикл один раз и программа крашится. В чем может быть причина?
Руки?
Работа с удаленным сервером в отличие от локального файла происходит не мгновенно, поэтому нельзя писать так:
socket->connect();
socket->write();
Ибо на установку соединения необходимо время. Писать в сокет, который еще не соединен с сервером, очевидно, бессмысленно. Делайте так:
1. socket->connect()
2. <Ожидание готовности сокета...>
3. socket->write()
4. <Ожидание, пока данные будут записаны/отправлены...>
5. Закрытие сокета
Для того, чтобы определить в каком месте программа рушится, запускайте ее под отладчиком. В этом случае она как минимум выдаст сообщение об ошибке и остановится в отладчике, а не просто вылетит.