W5100 TCP Socket does not reconnect

Поднял сервер TCP на W5100. Работаю по прерываниям. Если изменилось состояние, то МК получает прерывание от W5100, вычитывает регистр Sn_IR и вызывает соответствующий обработчик. Всё работает. Все прерывания работают. Возникает проблема, при нештатной потери связи. Например: установил связь (т.е. клиент открыл сокет на W5100, сокет перешел в состояние SOCK_ESTABLISHED. Если клиент закрывает сокет, то w5100 выставляет флаг прерывания DISCON в регистре Sn_IR. Вызываеся обработчик и чипу w5100 даются команды close/open/listen. Но если установить соединение и выдернуть кабель LAN из розетки, то W5100 этого не замечает. W5100 продолжает находиться в состоянии SOCK_ESTABLISHED. При восстановлении линии связи (воткнули в розетку LAN кабель) и при попытке заного клиентом открыть сокет - ни чего не получается. сокет на W5100 занят предыдущим соединением… сокет открыт… а новый клиент не может подключиться.

Как можно чипом W5100 отследить обрыв линии?

Для того, чтобы микрокод чипа W5100 определил, что есть разрыв связи, он должен что-то послать, и не получить ACK на это что-то. Я очень опасаюсь, что в W5100 на уровне “внутренностей чипа” такое невозможно, то есть только приложение может инициировать такой обмен - послать, скажем, байт, и другая сторона ответить на него.

В W5500 есть фишка keep-alive packet, в W5100 её нет.

В протоколе HTTP просто так байт как keep-alive не пошлешь, на том конце может случиться заворот кишок.

Однако мы на выдумки хитры - можно, по другому сокету, пробовать посылать пакеты PING на клиента, и если, он не отвечает, скажем, в течение 10 секунд, считать связь поретянной. Однако это не будет работать в случае, если ICMP блокируется по пути к клиенту.

Или не делать постоянные TCP соединения - послал, принял, закрыл.

Или использовать режим RAW у сокета 0 - тут вообще возможнойстей уйма (но будет страдать производительность).

Однако есть и положительная сторона этого безобразия с W5100. Если вы выдернете кабель на несколько секунд, а потом его обратно воткнете, все будет продолжать работать! Правда я делал это только с чипом будучи клиентом, а не сервером.

1 Like

Большое спасибо за ответ.

1 Like