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

 
 
> 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
Ответов
Kolyag87
сообщение Jul 24 2013, 10:22
Сообщение #2





Группа: Новичок
Сообщений: 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 Текстовая версия Сейчас: 21st August 2025 - 21:16
Рейтинг@Mail.ru


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