Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR32+FreeRTOS+lwip(UDP)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > AVR32
Pasa
AVR32+FreeRTOS+lwip(UDP). За основу взят пример BasicWEB из фреймворка - инициализации стека. После запускаю поток .

CODE
Просто читаю пакеты с порта:

{
struct netconn *conn;
struct netbuf *buf;
char *data;
int len;

conn = netconn_new( NETCONN_UDP );

//netconn_bind(conn, NULL, 5001);
netconn_bind(conn, IP_ADDR_ANY, 5001);


for( ;; )
{

buf = netbuf_new();
data =netbuf_alloc(buf, 200);

if( (buf = netconn_recv(conn)) != NULL )
{
len=0;
netbuf_data(buf,&data,&len);
....печать на консоль len=........
}


netbuf_delete(buf); // De-allocate packet buffer

vTaskDelay( 20 );
}

}

Пакеты шлю своей прогой или снифером. Размер данных - 7 байт. Размер всего UDP-пакета 49 байт.
Принимается только 2 пакета. После этого зависает на netconn_recv().
После вызова netbuf_data(buf,&data,&len) значени len = 458752 !!!!! 05.gif


Где я неправ? Подскажите где копать.
Заранее всем благодарен за помощь.
aba
Ну, вообщето, в примере BasicWEB используется TCP, а не UDP. Если вы хотите UDP, то посмотрите на пример BasicTFTP.
И похоже на то, ято у Вас не закрывается соединение, и после приёма второго пакета исчерпывается лимит подключений.
Pasa
То что в BasicWEB используется TCP это конечно же понятно. Я может не так выразился. В примере из фреймворка присутсвуют и WEB и TFTP серверы. Я имел ввиду, что из ветки BasicWEB вынес инициализацию стека в свою отдельную функцию. А сам алгоритм приема попробовал сочинить глядя на пример ниже:


ссылка на пример


CODE
Network connection programming
Reference for these functions can be found in "Design and Implemention of the lwIP TCP/IP Stack" by Adam Dunkels
Replace portTASK_FUNCTION( vBasicTFTPServer, pvParameters ) with this:


portTASK_FUNCTION( vBasicTFTPServer , pvParameters ){
struct netconn *conn;
char msg[]="testing";
struct netbuf *buf;
char * data;

conn = netconn_new( NETCONN_UDP );
netconn_bind(conn, IP_ADDR_ANY, 1234 ); //local port

netconn_connect(conn, IP_ADDR_BROADCAST, 1235 );
for(;; ){
buf = netbuf_new();
data =netbuf_alloc(buf, sizeof(msg));
memcpy (data, msg, sizeof (msg));
netconn_send(conn, buf);
netbuf_delete(buf); // De-allocate packet buffer

vTaskDelay( 200 ); //some delay!
}
}


Вроде тут закрытия соединения нет. И у меня тоже соединение(если можно так сказать) только один раз, вне бесконечного цикла. И потом, UDP работет без установления соединения, если я не ошибаюсь.
Может Вы имели ввиду закрытие рабочего сокета(где обмен данными) в режиме TCP?

Хотя мысль о переполнении интересная и надо подумать ее.
aba
Цитата
Может Вы имели ввиду закрытие рабочего сокета(где обмен данными) в режиме TCP?

Да, именно это я и имел ввиду.
В Вашем коде вы создаёте соединение, а в UDP соединения как такового нет.
Посмотрите пример TFTP. В этом примере используется UDP и никаких "netconn..." функций нету, есть только биндинг сокета на порт и приём.
Pasa
Если я правильно понял, то в lwip есть три уровня использования API: RAW(самый нижний), NETCONN(надстройка над RAW), SOCKET(надстройка над NETCONN).
По быстрому посмотрел пример TFTP (реализован через socket API)- в конце концов все в результате сводится к вызову все тех же netconn-функций, собственно что логично
вытекает из выше сказанного. Конечно - есть свои нюансы. Но суть не меняется.
Пример web сервера я попробовал – все работает. Но мне надо udp. Думал, что с наскоку
по примерам запущу udp-эхо через netconn-API … да не тут-то было. Придется делать
”более глубокое погружение”. Само собой попробую и TCP и SOCKET-API.
Но ведь, по идее, должны исправно работать все уровни. Опять же и примеры есть (ссылка в 3 посту)
Что же , пойду учить матчасть….


Цитата(aba @ Oct 27 2011, 13:34) *
В Вашем коде вы создаёте соединение, а в UDP соединения как такового нет.
Посмотрите пример TFTP. В этом примере используется UDP и никаких "netconn..." функций нету, есть только биндинг сокета на порт и приём.


Так вроде и я никаких соединений не создаю... Собственно весь алгоритм сводится к:

conn = netconn_new( NETCONN_UDP );
netconn_bind(conn, IP_ADDR_ANY, 5001);
for(;;)
{
netconn_recv(conn);
}

В примере TFTP все примерно так же:

socket() (сводится к netconn_new())
bind() (сводится к netconn_bind())

Может я что упустил важное.....тогда тыкните меня носом, только спасибо скажу...честно.... sm.gif


Заранее благодарен тем, кто поможет дельным советом разрулить ситуацию.
Pasa
эксперименты покази следующее:

при использовании самого верхнего уровня API(SOCKET) получается вполне работоспособная и не дохнущая система в виде

Код
lSocket = socket();

bind(lSocket);

for(;;)
   {
      recvfrom(lSocket);
   }


Почему не работает аналогичная конструкция на уровне NETCONN.....мммм.....видимо есть тонкости которые я упустил.
С другой стороны все бралось из примеров... короче - если у кого есть мысли по этому поводу ....буду рад услышать.
А пока на радостях пойду расковыривать тонкости API-SOCKET... к нижним уровням вернусь, когда встанет вопрос скорости обмена.
kan35
Ну если на сокетах все работает - то почему бы не посмотреть в файл sockets.c и не проверить свои действия с netconn. Сразу все тонкости и увидите.
Надеюсь этот совет поможет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.