Pasa 0 27 октября, 2011 Опубликовано 27 октября, 2011 (изменено) · Жалоба 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: Где я неправ? Подскажите где копать. Заранее всем благодарен за помощь. Изменено 27 октября, 2011 пользователем IgorKossak [codebox] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aba 0 27 октября, 2011 Опубликовано 27 октября, 2011 (изменено) · Жалоба Ну, вообщето, в примере BasicWEB используется TCP, а не UDP. Если вы хотите UDP, то посмотрите на пример BasicTFTP. И похоже на то, ято у Вас не закрывается соединение, и после приёма второго пакета исчерпывается лимит подключений. Изменено 27 октября, 2011 пользователем aba Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 27 октября, 2011 Опубликовано 27 октября, 2011 (изменено) · Жалоба То что в 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? Хотя мысль о переполнении интересная и надо подумать ее. Изменено 27 октября, 2011 пользователем Pasa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aba 0 27 октября, 2011 Опубликовано 27 октября, 2011 · Жалоба Может Вы имели ввиду закрытие рабочего сокета(где обмен данными) в режиме TCP? Да, именно это я и имел ввиду. В Вашем коде вы создаёте соединение, а в UDP соединения как такового нет. Посмотрите пример TFTP. В этом примере используется UDP и никаких "netconn..." функций нету, есть только биндинг сокета на порт и приём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 27 октября, 2011 Опубликовано 27 октября, 2011 · Жалоба Если я правильно понял, то в 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()) Может я что упустил важное.....тогда тыкните меня носом, только спасибо скажу...честно.... :) Заранее благодарен тем, кто поможет дельным советом разрулить ситуацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 27 октября, 2011 Опубликовано 27 октября, 2011 · Жалоба эксперименты покази следующее: при использовании самого верхнего уровня API(SOCKET) получается вполне работоспособная и не дохнущая система в виде lSocket = socket(); bind(lSocket); for(;;) { recvfrom(lSocket); } Почему не работает аналогичная конструкция на уровне NETCONN.....мммм.....видимо есть тонкости которые я упустил. С другой стороны все бралось из примеров... короче - если у кого есть мысли по этому поводу ....буду рад услышать. А пока на радостях пойду расковыривать тонкости API-SOCKET... к нижним уровням вернусь, когда встанет вопрос скорости обмена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 12 ноября, 2011 Опубликовано 12 ноября, 2011 · Жалоба Ну если на сокетах все работает - то почему бы не посмотреть в файл sockets.c и не проверить свои действия с netconn. Сразу все тонкости и увидите. Надеюсь этот совет поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться