Хм, а как такой сокет можно закрыть чисто теоретически? Таймаут у read() помог бы?
там кажется пинги через этот сокет ходили. Устройство пингует сервер раз в 30 секунд. Если на пинг в течение таймаута не пришел ответ — отваливаемся и реконнектимся. А само устройство работает в бесконечном цикле: постоянно обновляет состояние датчиков, и шлет на сервер когда происходят какие-то события. И не забывает про пинг. А если ответ не пришел, но пинги ходят — так и ждем ответа....