Перейти к содержанию
    

AVR32+FreeRTOS+lwip(UDP)

AVR32+FreeRTOS+lwip(UDP). За основу взят пример BasicWEB из фреймворка - инициализации стека. После запускаю поток .

 

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

{
       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:

 

 

Где я неправ? Подскажите где копать.

Заранее всем благодарен за помощь.

Изменено пользователем IgorKossak
[codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, вообщето, в примере BasicWEB используется TCP, а не UDP. Если вы хотите UDP, то посмотрите на пример BasicTFTP.

И похоже на то, ято у Вас не закрывается соединение, и после приёма второго пакета исчерпывается лимит подключений.

 

Изменено пользователем aba

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что в BasicWEB используется TCP это конечно же понятно. Я может не так выразился. В примере из фреймворка присутсвуют и WEB и TFTP серверы. Я имел ввиду, что из ветки BasicWEB вынес инициализацию стека в свою отдельную функцию. А сам алгоритм приема попробовал сочинить глядя на пример ниже:

 

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да, именно это я и имел ввиду.

В Вашем коде вы создаёте соединение, а в UDP соединения как такового нет.

Посмотрите пример TFTP. В этом примере используется UDP и никаких "netconn..." функций нету, есть только биндинг сокета на порт и приём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял, то в lwip есть три уровня использования API: RAW(самый нижний), NETCONN(надстройка над RAW), SOCKET(надстройка над NETCONN).

По быстрому посмотрел пример TFTP (реализован через socket API)- в конце концов все в результате сводится к вызову все тех же netconn-функций, собственно что логично

вытекает из выше сказанного. Конечно - есть свои нюансы. Но суть не меняется.

Пример web сервера я попробовал – все работает. Но мне надо udp. Думал, что с наскоку

по примерам запущу udp-эхо через netconn-API … да не тут-то было. Придется делать

”более глубокое погружение”. Само собой попробую и TCP и SOCKET-API.

Но ведь, по идее, должны исправно работать все уровни. Опять же и примеры есть (ссылка в 3 посту)

Что же , пойду учить матчасть….

 

 

В Вашем коде вы создаёте соединение, а в 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())

 

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

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

lSocket = socket();

bind(lSocket);

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

 

Почему не работает аналогичная конструкция на уровне NETCONN.....мммм.....видимо есть тонкости которые я упустил.

С другой стороны все бралось из примеров... короче - если у кого есть мысли по этому поводу ....буду рад услышать.

А пока на радостях пойду расковыривать тонкости API-SOCKET... к нижним уровням вернусь, когда встанет вопрос скорости обмена.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если на сокетах все работает - то почему бы не посмотреть в файл sockets.c и не проверить свои действия с netconn. Сразу все тонкости и увидите.

Надеюсь этот совет поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...