gravl4 0 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба доброго времени нужна простейшая программа посылающая данны по UDP. железка пингуется отлично, прослушиваю вот так nc -u -l 7 . по wireshark никаких данных нет. вот такой код: /* StartSocketServer function */ void StartSocketServer(void) { /* Infinite loop */ for (;;) { int sock; struct sockaddr_in address; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { address.sin_family = AF_INET; address.sin_port = htons(7); struct ip_addr pcaddr; IP4_ADDR(&pcaddr, 192, 168, 0, 5); address.sin_addr.s_addr = pcaddr.addr; //if (bind(sock, (struct sockaddr*) &address, sizeof(address)) == 0) { //listen(sock, 5); for (;;) { char out_buffer[100]; sprintf(out_buffer, "hello udp \r\n"); // //xRxedStructure.ucMessageID); sendto(sock, out_buffer, strlen((char*) out_buffer), NETCONN_UDP, //22, 0, (struct sockaddr*) &address, sizeof(address)); vTaskDelay(1000); } } } /* Infinite loop */ // for (;;) { vTaskDelay(1); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { . . . . } Возможно дает ошибку. Но мы о ней не знаем ввиду отсутствия else { } или хотя-бы ногодрыг-LED в цикле for(;;) {} Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз ? Если уж экономим электроны и букфы, пишем while(1). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 9 minutes ago, k155la3 said: Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз ? Так-таки и первый? Вот не верю, что можно работать с сокетами и никогда не встречать for(;;) :) 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 2 часа назад, k155la3 сказал: Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз? Вполне законное описание бесконечного цикла, согласно синтаксису Си Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба On 9/14/2022 at 11:30 PM, Arlleex said: Вполне законное описание бесконечного цикла, согласно синтаксису Си Как-то где-то () даже встречал статью, что for(;;) синтаксически более правильно, чем while(1). Но сейчас с ходу ничего такого найти не смог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 6 минут назад, dimka76 сказал: Как-то где-то () даже встречал статью, что for(;;) синтаксически более правильно, чем while(1). Некоторые компиляторы теоретически могут проблемно преобразовывать тип (1) в управляющем выражении, поэтому и правильно, видимо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба Константа в управляющем выражении не комильфо, примерно как if(1) писать. Но: - всем давно всё равно - есть "законные" приемы с константой, типа do {} while(0) Так что допустимы оба варианта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 34 минуты назад, Arlleex сказал: Вполне законное описание бесконечного цикла, согласно синтаксису Си 2 часа назад, aaarrr сказал: Так-таки и первый? Вот не верю, что можно работать с сокетами и никогда не встречать for(;;) :) Да, действительно, не первый :)))) по всей видимости, второй, вспомнил, с таких примеров начинал по книге лет 15 назад, там были эти for(;;), книга кажется по BSD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба хм. такое оживление по поводу for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 2 часа назад, jenya7 сказал: хм. такое оживление по поводу for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм? Если к моменту выхода из sendto(), out_buffer более не используется стеком внутри, то всё нормально. Или что именно вам не нравится? PS: А вот strlen() там совершенно лишний. Если вспомнить, что sprintf() и так возвращает количество данных, записанных в буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 2 часа назад, jenya7 сказал: хм. такое оживление по поводу for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм? Это "декларация", что внутри данного блока { } динамически выделяется место в стеке под массив. А компилятр-препроцессор умный, он декларацию от кода отличает. Вот еслиб была ф-ия malloc( char * char_out_buffer, 100), те исполнимый код - тогда да, что пИсатель напИсал, то и будет сделано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 25 октября, 2022 Опубликовано 25 октября, 2022 · Жалоба 9 минут назад, k155la3 сказал: Это "декларация", что внутри данного блока { } динамически выделяется место в стеке под массив. Всё-таки правильная терминология (по си): буфер out_buffer выделяется в автоматической памяти. Динамическая память - это несколько иное. Чтобы не было путаницы. 9 минут назад, k155la3 сказал: А компилятр-препроцессор умный, он декларацию от кода отличает. Вот еслиб была ф-ия malloc( char * char_out_buffer, 100), те исполнимый код - тогда да, что пИсатель напИсал, то и будет сделано. Если sendto() знает, что ей передаётся указатель на динамическую память и (с момента вызова) является владельцем переданного блока памяти (обязана освободить по завершении использования), то всё было бы ок. И даже не требовался бы блокирующий стиль работы sendto(). А вот передача указателя на автоматическую память, требует чтобы sendto() была блокирующей (как писал выше). 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться