Я делаю некоторые эксперименты над ненадежной радиосетью (самодельной), используя очень элементарное программирование сокетов Java для передачи сообщений назад и вперед между конечными узлами.
Установка выглядит следующим образом:
Узел A --- Узел реле --- Узел B
Одна проблема, с которой я постоянно сталкиваюсь, заключается в том, что каким-то образом соединение прерывается, и ни узел A, ни B не знают, что канал не работает, и все же продолжают передавать данные. Соединение TCP также не истекает. Я добавил сообщение, которое через некоторое время вызывает тайм-аут, но я все же хотел бы знать, что является основной причиной того, что TCP не делает тайм-аут.
Вот параметры, которые я включаю при настройке сокета:
channel.socket().setKeepAlive(false);
channel.socket().setTrafficClass(0x08); // for max throughput
Это поведение странное, поскольку оно полностью отличается от того, когда у меня есть проводная сеть. В проводной сети я могу смоделировать отключенное соединение, вытянув шнур Ethernet, однако, как только я снова подключу шнур, соединение будет восстановлено, и сообщения начнут проходить еще раз.
В радиосети соединение никогда не восстанавливается, и когда оно молча умирает, сообщения никогда не возобновляются.
Есть ли еще какие-то неизвестные java-установки или настройки для сокета, которые я могу использовать, кроме того, почему я вижу это поведение в первую очередь?
И да, прежде чем кто-либо что-то скажет, я знаю, что TCP не является предпочтительным выбором по ненадежной сети, но в этом случае я хотел гарантировать отсутствие потери пакетов.