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

 
 
> STM32F207+FreeRTOS+LwIP Как правильно закрыть соединение?
=F8=
сообщение Dec 13 2011, 11:26
Сообщение #1


Знающий
****

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



Девайс работает как сервер. После того как от netconn_accept будет получено новое соединение создаю 2 потока один для чтения, другой для записи. Читаю вот так:
Код
void СE2ComRead::СThread()
{
    struct netbuf *buf;
    while((!TerminateFlag)&&((buf = netconn_recv(Conn)) != NULL))
    {
        do{
            char *p_data;
            u16_t len;

            if(netbuf_data(buf, (void**)&p_data, &len) == ERR_OK)
            {
                if(pPort->Write(p_data, len, 2000) != len)
                {
                    TerminateFlag = 1;
                }
                if(TerminateFlag)break;
            }
        }while(netbuf_next(buf) >= 0);
        netbuf_delete(buf);
    }
}

Столкнулся с такой проблемой когда закрываю соединение из другого потока функцией netconn_close() то читающий поток остается висеть в netconn_recv пока не выйдет по таймауту. Есть какой-небудь "легальный" способ решить проблему? А то пока приходит в голову только вариант вручную отправить сообщение в очередь conn->recvmbox.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Dec 13 2011, 18:24
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Тоже самое... Сперва разделил на 2 потока, но пришлось все в 1 поток... иного пути нет к сожалению.

У меня сопутствующий вопрос: как остановить корректно стек (ppp и tcp), чтобы перевести модем в AT режим и потом вернуть его назад в режим данных без сбоев соединения? ведь в любое время могут как минимум прийти пакет из модема, и если в это время сделать +++ - то произвойдет неладное, или напримр стек шлет повторные пакеты (при ненадежном соединении), а снаружи можем выглядит незанятым....
Go to the top of the page
 
+Quote Post
=F8=
сообщение Dec 13 2011, 20:38
Сообщение #3


Знающий
****

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



Цитата(kan35 @ Dec 13 2011, 21:24) *
Тоже самое... Сперва разделил на 2 потока, но пришлось все в 1 поток... иного пути нет к сожалению.

У меня сопутствующий вопрос: как остановить корректно стек (ppp и tcp), чтобы перевести модем в AT режим и потом вернуть его назад в режим данных без сбоев соединения? ведь в любое время могут как минимум прийти пакет из модема, и если в это время сделать +++ - то произвойдет неладное, или напримр стек шлет повторные пакеты (при ненадежном соединении), а снаружи можем выглядит незанятым....

МИХО в этом случае лучше сразу использовать мультиплексный режим. По одному из виртуальных портов поднимаете GPRS соединение, по другому опрашиваете модем. По ссылке описание мультиплексного режима.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 8th August 2025 - 02:31
Рейтинг@Mail.ru


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