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

lwip udp не отсылает данные

доброго времени

нужна простейшая программа посылающая данны по 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);
	}
}

 

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


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

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) 
{
. . . .
}

Возможно дает ошибку. Но мы о ней не знаем ввиду отсутствия else { } или хотя-бы ногодрыг-LED в цикле for(;;) {}

Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз ?

Если уж экономим электроны и букфы, пишем while(1).

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


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

9 minutes ago, k155la3 said:

Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз ?

Так-таки и первый? Вот не верю, что можно работать с сокетами и никогда не встречать for(;;) :)

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


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

2 часа назад, k155la3 сказал:

Первый раз такое (простигосподи) вижу - for(;;). Оно вообще выполняется хоть раз?

Вполне законное описание бесконечного цикла, согласно синтаксису Си:wink:

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


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

On 9/14/2022 at 11:30 PM, Arlleex said:

Вполне законное описание бесконечного цикла, согласно синтаксису Си:wink:

Как-то где-то (:biggrin:) даже встречал статью, что for(;;) синтаксически более правильно, чем while(1).

Но сейчас с  ходу ничего такого найти не смог.

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


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

6 минут назад, dimka76 сказал:

Как-то где-то (:biggrin:) даже встречал статью, что for(;;) синтаксически более правильно, чем while(1).

Некоторые компиляторы теоретически могут проблемно преобразовывать тип (1) в управляющем выражении, поэтому и правильно, видимо...:smile:

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


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

Константа в управляющем выражении не комильфо, примерно как if(1) писать. Но:

- всем давно всё равно

- есть "законные" приемы с константой, типа do {} while(0)

Так что допустимы оба варианта.

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


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

34 минуты назад, Arlleex сказал:

Вполне законное описание бесконечного цикла, согласно синтаксису Си:wink:

2 часа назад, aaarrr сказал:

Так-таки и первый? Вот не верю, что можно работать с сокетами и никогда не встречать for(;;) :)

Да, действительно, не первый :)))) по всей видимости, второй, вспомнил:russian_ru:, с таких примеров начинал по книге лет 15 назад, там были эти for(;;), книга кажется по BSD.

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


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

хм. такое оживление по поводу  for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм?

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


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

2 часа назад, jenya7 сказал:

хм. такое оживление по поводу  for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм?

Если к моменту выхода из sendto(), out_buffer более не используется стеком внутри, то всё нормально. Или что именно вам не нравится?

 

PS: А вот strlen() там совершенно лишний. Если вспомнить, что sprintf() и так возвращает количество данных, записанных в буфер.

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


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

2 часа назад, jenya7 сказал:

хм. такое оживление по поводу  for(;;). а char out_buffer[100]; в этом for(;;) это как, всё норм?

Это "декларация", что внутри данного блока  { } динамически выделяется место в стеке под массив. А компилятр-препроцессор умный, он декларацию от кода отличает. Вот еслиб была ф-ия malloc( char * char_out_buffer, 100), те исполнимый код - тогда да, что пИсатель напИсал, то и будет сделано.  

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


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

9 минут назад, k155la3 сказал:

Это "декларация", что внутри данного блока  { } динамически выделяется место в стеке под массив.

Всё-таки правильная терминология (по си): буфер out_buffer выделяется в автоматической памяти. Динамическая память - это несколько иное. Чтобы не было путаницы.

9 минут назад, k155la3 сказал:

А компилятр-препроцессор умный, он декларацию от кода отличает. Вот еслиб была ф-ия malloc( char * char_out_buffer, 100), те исполнимый код - тогда да, что пИсатель напИсал, то и будет сделано.  

Если sendto() знает, что ей передаётся указатель на динамическую память и (с момента вызова) является владельцем переданного блока памяти (обязана освободить по завершении использования), то всё было бы ок. И даже не требовался бы блокирующий стиль работы sendto(). А вот передача указателя на автоматическую память, требует чтобы sendto() была блокирующей (как писал выше).

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


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

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

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

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

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

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

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

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

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

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