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

 
 
 
Reply to this topicStart new topic
> AVR32+FreeRTOS+lwip(UDP)
Pasa
сообщение Oct 27 2011, 01:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



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


Где я неправ? Подскажите где копать.
Заранее всем благодарен за помощь.

Сообщение отредактировал IgorKossak - Oct 27 2011, 07:56
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
aba
сообщение Oct 27 2011, 07:06
Сообщение #2


Участник
*

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



Ну, вообщето, в примере BasicWEB используется TCP, а не UDP. Если вы хотите UDP, то посмотрите на пример BasicTFTP.
И похоже на то, ято у Вас не закрывается соединение, и после приёма второго пакета исчерпывается лимит подключений.


Сообщение отредактировал aba - Oct 27 2011, 07:08
Go to the top of the page
 
+Quote Post
Pasa
сообщение Oct 27 2011, 08:11
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



То что в 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?

Хотя мысль о переполнении интересная и надо подумать ее.

Сообщение отредактировал Pasa - Oct 27 2011, 08:15
Go to the top of the page
 
+Quote Post
aba
сообщение Oct 27 2011, 09:04
Сообщение #4


Участник
*

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



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

Да, именно это я и имел ввиду.
В Вашем коде вы создаёте соединение, а в UDP соединения как такового нет.
Посмотрите пример TFTP. В этом примере используется UDP и никаких "netconn..." функций нету, есть только биндинг сокета на порт и приём.
Go to the top of the page
 
+Quote Post
Pasa
сообщение Oct 27 2011, 12:41
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



Если я правильно понял, то в 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


Заранее благодарен тем, кто поможет дельным советом разрулить ситуацию.
Go to the top of the page
 
+Quote Post
Pasa
сообщение Oct 27 2011, 14:09
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 4-03-09
Из: Беларусь, Минск
Пользователь №: 45 665



эксперименты покази следующее:

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

Код
lSocket = socket();

bind(lSocket);

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


Почему не работает аналогичная конструкция на уровне NETCONN.....мммм.....видимо есть тонкости которые я упустил.
С другой стороны все бралось из примеров... короче - если у кого есть мысли по этому поводу ....буду рад услышать.
А пока на радостях пойду расковыривать тонкости API-SOCKET... к нижним уровням вернусь, когда встанет вопрос скорости обмена.
Go to the top of the page
 
+Quote Post
kan35
сообщение Nov 12 2011, 13:38
Сообщение #7


Знающий
****

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



Ну если на сокетах все работает - то почему бы не посмотреть в файл sockets.c и не проверить свои действия с netconn. Сразу все тонкости и увидите.
Надеюсь этот совет поможет.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:51
Рейтинг@Mail.ru


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