1. Бывают ли реализации клиент-серверных приложений, в которых клиент подключившись однажды постоянно работает и обмениваться информацией с сервером, и только по завершении работы отключается?
Такие приложения возможны, только нужно помнить, что сервер должен хранить информацию о всех подключениях, а это ресурсы, которые заканчиваются.
2. Можно ли как-то реализовать взаимосвязь между клиентом и сервером как между функциями в обычной программе, или слотами в Qt?
Подобные протоколы существуют, например XML-RPC.
3. Можно ли передавать информацию в оба конца используя один и тот же соккет (то есть с сервера на клиент, и с клиента на сервер)?
Да.
3.1 Как правильно передавать информацию по TCP, особенно интересует проверка все ли пакеты дошли, а то из всех прочитанных примеров я так ничего и не понял.
Общение должно осуществляться по определенных правилам (протоколам).
На определенные протоколы есть спецификации, но можно придумать и свой проток.
Что бы определить, что пришли все данные, можно сначала отослать их длину, потом данные, вторая сторона зная длину, будет ждать получения полного пакета. Можно в конце данных передавать какую-то сигнатуру, по которой принимающая сторона определит, что пакет закончился.
Много чего можно придумать.
Посмотри спецификации на протоколы HTTP, FTP, ... Подумай...