Пока видно, что дивайсы используют адреса из подсети с диапазоном всего в 254 адреса.
Поскольку сервер сообщает о закрытии сокета значит либо он явно получает команду о закрыти либо сам инициирует закрытие.
Контроль Keep Alive проходит гораздо реже, раз в 2-а часа где-то по умолчанию.
Т.е. ваши разрывы никак не связаны с фиксацией самими сокетами долгого отсутствия связи.
Еще раз советую поставить снифер на компе сервера и смотреть его лог.
Ну а лучше и безопасней делать внешний TCP стек в дивайсах. Будет гораздо проще отлаживать такие проблемы.
Цитата(GP_ @ Mar 6 2009, 10:59)

2009-03-06 01:14:56:187 TcpServer::accept_new_connections() new connection 192.168.5.1:53418 connects.size()=2
С закрытием сложнее.
2009-03-06 00:45:18:031 GsmIpDevice::do_read_connection() 192.168.5.1:61195: Socket was closed
2009-03-06 00:45:18:031 TcpServer::close_connect() 192.168.5.1:61195
Или
2009-03-06 01:19:47:015 TcpServer::validate() connection 192.168.5.1:61763 expired (прим., встречается редко)
Во втором случае, думаю, сервер закрывает. В первом даже затрудняюсь сказать, кто закрываает.
И это еще не значит что сокет закроется.
В либах Indy сокеты ничего не сообщат даже через 2-а часа молчания. Там просто нет такого ивента.
И кстати приводят довольно убедительное обоснование такой философии.
В частности утверждая что это (в смысле управление тайм-аутами подключений) должно определяться характером приложения и очень индивидуально.
Цитата(Rst7 @ Mar 6 2009, 12:57)

Да ну? Откуда такое требование? Не говоря уже о том, что RFC1122 говорит о двухчасовом периоде Keep-Alive по дефолту.
Другое дело, что 2 часа - весьма занадто для GPRS. Так что лучше выбрать время поменьше. Правда, под виндой это время устанавливается единоразово ключем в реестре. Так что для портабельности лучше делать собственный Keep-Alive в виде маленького пакетика данных, посылаемого с нужным периодом.