реклама на сайте
подробности

 
 
> FreeRTOS + LwIP + PPP Как правильно переинициализировать соединение
=F8=
сообщение Jul 19 2013, 11:36
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Есть девайс с LPC2148 + GSM модуль. На девайсе используется связка FreeRTOS + IwIP + PPP(который входит в IwIP).
Столкнулся с проблемой при переинициализации PPP соединения, для простоты опишу порядок действий:

tcpip_init();

while(1){
Включаю и инициализирую gsm модуль.

pppInit(); Инициализирую соединение
pppSetAuth(); Устанавливаю параметры авторизации
pppOverSerialOpen(); Поднимаю соединение pppOverSerialOpen

Затем создаю и затем открываю серверное соединение;
netconn_new();
netconn_bind();
netconn_listen();

Жду входящего соединения;
if(netconn_accept() == ERR_OK)
{
Принимаю входящее соединение, начинаю передавать данные от мк компу,
и в этот момент откручиваю антенну от модуля, через 5-10 сек мк понимает что регистрация в сети потеряна.
После чего закрываю дочернее соединение.
netconn_delete(conn);
}
И затем серверное
netconn_delete(srv_conn);
И затем ppp
pppClose()

}

Так, вот на следующем цикле при выполнении netconn_bind получаю ответ ERR_USE. Если подождать около 90 сек то на следующий вызов netconn_bind получаю ответ ERR_OK. Т.е. такое впечатление, что lwip пытается передать непереданные пакеты из буфера, хотя соединение уже закрыто.
Есть ли какой-то способ полностью переинициализировать стек? Просто ждать крайне нежелательно...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Golikov A.
сообщение Jul 19 2013, 16:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Он не пакеты передает.

после того как вы вызывали netconn_delete, pppClose() оно не закрывается, а помечается на закрытие. В ЛвИП есть медленный таймер, вот именно он проверяет все открытые сессии и закрывает те что помечены как закрывающиеся. До этого момента все параметры соединения в общей таблице лежат, и при попытке сделать новое соединение получите сообщение что оно уже есть.

Go to the top of the page
 
+Quote Post
=F8=
сообщение Jul 20 2013, 13:52
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(Golikov A. @ Jul 19 2013, 19:09) *
В ЛвИП есть медленный таймер, вот именно он проверяет все открытые сессии и закрывает те что помечены как закрывающиеся.

Не думаю, что дело в этом. Во-первых эта ситуация возникает только при обрыве связи в момент передачи от мк к компу т.е. явно связана с наличием данных в буфере, во-вторых перезапуск gsm модуля дело не быстрое то-есть между попытками создать соединение проходит около 20-30 сек - вполне достаточно для отработки внутренних механизмов закрытия соединения.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 20 2013, 17:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



если вы их вызывали... хотя может и мак чего то там думает себе...

у меня было 2 порта, один контрольный другой для данных так вот сервер на прослушку для данных я открывал только после того как было соединение по контрольному. А при закрытии контрольного закрывал сервер. И если быстро открыть закрыть, то получал ошибку что типа порт уже используется. А если погодя то все проходило. При этом через порт данных ничего не слалось.

Вроде бы в медленном таймере я глядел есть код который шерстит все соединения и находит те что открыты. Да там есть кусок который пытается дослать все что осталось, а также дослать сигнал разрыва соединения, но вроде бы все должно сработать в течении каких то секунд, а не десятков...
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 20 2013, 17:38
Сообщение #5


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Во-первых эта ситуация возникает только при обрыве связи в момент передачи от мк к компу т.е. явно связана с наличием данных в буфере

Это ситуация связана с протоколом TCP он расчитан на то что связь может пропадать на короткое время, вот и Вас связь оборвалась а TCP коректно не закрылось, (для того что бы TCP коретно закрылось должен пройти обмен пакетами), вот и висит он в состояни CLOSE_WAIT.

Попробуйте установить опцию
#define SO_REUSE 1

P.S. Надеюсь вы не закрываете netconn переданный в listen, его не надо удалять без особой надобности при потере коннекта.А удаляете только созданные listen коннекты.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jul 22 2013, 13:28
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата
но вроде бы все должно сработать в течении каких то секунд, а не десятков...

Возможно дело в том, что у меня GPRS. После разрыва как правило меняется IP, так-что досылать некуда, вот и ждет (время ожидания ACK) * (кол-во попыток).
Цитата
Попробуйте установить опцию
#define SO_REUSE 1

Не помогло sad.gif
Цитата
Надеюсь вы не закрываете netconn переданный в listen, его не надо удалять без особой надобности при потере коннекта.

Закрываю, дело в том, что при презагрузке модуля может произойти смена сим-карты и соотв режима работы - может понадобиться открыть другой порт, или вместо серверного поднять клиентское соединение итд.

Go to the top of the page
 
+Quote Post
Kolyag87
сообщение Jul 24 2013, 10:22
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 11-02-13
Пользователь №: 75 577



У протокола TCP есть состояние TIME-WAIT. Об этом можно вкратце почитать http://xn--80ae9aggj.xn--p1ai/2009/01/19/tcp-time-wait/.

Чтобы вызвать процесс закрытия соединения, т.е. отправку пакета FIN (как сказано по указанной ссылке), необходимо вызвать netconn_close() для TCP-соединения (или netconn_disconnect() для UDP-соединения) перед вызовом netconn_delete(). После вызова netconn_close() необходимо сделать небольшую задержку, чтобы полностью произошел обмен пакетами FIN -> ACK. (примерно 2-3 сек). Параметр MSL (maximum segment lifetime) задается в файле tcp_impl.h (lwip-1.4.1) TCP_MSL (по умолчанию 60 сек). Поэтому пока период TIME-WAIT не закончится, вызов netconn_bind() будет выдавать ошибку.



У меня похожая проблема. МК выступает TCP-клиентом. После первого соединения с сервером, последующие не проходят. Повторный вызов функций netconn_new() возвращает NULL. И аналогично повторный вызов pppOverSerialOpen() возвращает ошибку. При этом пробовал делал задержки до 5 мин. Как будто вызов функций pppClose(), netconn_delete() не очищают память. Может не вызывать повторно функции pppOverSerialOpen() и netconn_new() и тогда все будет ОК.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 12:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016