|
LWIP Как послать данные (tcp_write) по событию? |
|
|
|
Apr 29 2014, 09:49
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577

|
Здравствуйте. Сделал на STM32F4 TCP/IP сервер c использованием lwip стека без OS. Все работает замечательно по типу запрос-ответ. Ответ процедурой tcp_write реализован как и требуется из callback. Но вот возникла необходимость посылать данные не по запросу, а по событию - по приходу строба на ножку. Делал ссылку на pcb во время коннекта клиента, и отправлял данные вне callback... Код struct tcp_pcb *Globalpcb; .... Globalpcb=pcb; ....
if(Globalpcb != NULL) { COUNT_TX=tcp_sndbuf(Globalpcb); if(COUNT_TX > Len) { err = tcp_write(Globalpcb, Data, Len, 1); tcp_output(Globalpcb); } } все работает..., но не долго - периодически стек падает. Вопрос как гармотно использовать tcp_write в данном случае чтобы не порушить стек? Кто сталкивался?
Сообщение отредактировал IgorKossak - Apr 29 2014, 11:34
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Apr 29 2014, 11:53
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577

|
Цитата(scifi @ Apr 29 2014, 13:44)  Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу. Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback?
|
|
|
|
|
Apr 29 2014, 12:51
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(js_slider @ Apr 29 2014, 15:53)  Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback? Элементарно. Предположим, программа зашла в tcp_write() из callback, меняет переменные, выделяет и освобождает память, пишет в буферы. И тут - БАЦ! - прерывание, и обработчик прерывания тоже заходит в tcp_write(), лезет в те же переменные и т.д. Так нельзя, всё сразу упадёт. Надо посылать в главный цикл сигнал из прерывания (через переменную volatile), и уже в главном цикле слать данные через TCP.
|
|
|
|
|
May 3 2014, 16:58
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577

|
Благодарю всех откликнувшихся. Проблема решена. Действительно стек падал из-за вызовов tcp_write из прерывания.
|
|
|
|
|
May 7 2014, 12:26
|
Группа: Новичок
Сообщений: 2
Регистрация: 27-03-13
Пользователь №: 76 235

|
Если можно, хочу задать вопрос в развитие данной темы.
Я тоже планирую использовать TCP/IP сервер c использованием lwip стека без OS.
Хочу на нем организовать рассылку данных в формате JSON по нескольким IP адресам (без запроса со стороны клиента).
Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому.
|
|
|
|
|
May 7 2014, 14:04
|
Группа: Новичок
Сообщений: 2
Регистрация: 27-03-13
Пользователь №: 76 235

|
Цитата(scifi @ May 7 2014, 16:50)  HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч. Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут. А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера?
|
|
|
|
|
May 19 2014, 08:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Хочу к своему проекту прикрутить либу LWIP, пока читаю доку и нахожу: Цитата It can send, receive and forward packets, but can not send or receive fragmented IP packets. Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!
|
|
|
|
|
May 19 2014, 08:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(scifi @ May 19 2014, 15:50)  Это сильно устаревшая информация. Там давно уже добавлено "IP layer fragmentation and reassembly". Читаю доку "Design and Implementation of the lwIP TCP/IP Stack" за 20.02.2001, и использовать хотел lwip v1.3.2 (она в техасовских примерах есть). Посоветуйте, что нового почитать, что-то в google ток эту нашёл. Будет ли поддержка фрагментации в v1.3.2 (12.2009) или брать новую версию?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|