Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Cетевые протоколы и технологии

Cетевые протоколы и технологии TCP/IP стек

Ответ
 
Опции темы Опции просмотра
Старый 28.12.2016, 15:23   #1
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Осваиваю работу UDP сервера на STM32F4. В общих чертах я понимаю так: при приеме пакета, данные копируются из DMA буферов в буферы LwIP, которые описываются связанным списком структур типа pbuf. При этом под эти буферы (и под список структур pbuf) выделяется память (функцией pbuf_alloc()). После этого пакет разбирается стеком LwIP, и если это данные для приложения, вызывается функция обратного вызова с указателем на связанный список структур pbuf, где расположены данные. В примере UDP эхо сервера эти данные передаются назад клиенту. Не понимаю, а где же происходит высвобождение памяти, выделенной под эти данные?
Pasha_Bi вне форума   Ответить с цитированием
Старый 28.12.2016, 16:04   #2
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Осваиваю работу UDP сервера на STM32F4. В общих чертах я понимаю так: при приеме пакета, данные копируются из DMA буферов в буферы LwIP, которые описываются связанным списком структур типа pbuf. При этом под эти буферы (и под список структур pbuf) выделяется память (функцией pbuf_alloc()). После этого пакет разбирается стеком LwIP, и если это данные для приложения, вызывается функция обратного вызова с указателем на связанный список структур pbuf, где расположены данные. В примере UDP эхо сервера эти данные передаются назад клиенту. Не понимаю, а где же происходит высвобождение памяти, выделенной под эти данные?
Память, выделенная под pbuf высвобождается в функции обратного вызова после обработки ответа. Это же в примере есть:
Код:
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
  /* Connect to the remote client */
  udp_connect(upcb, addr, UDP_CLIENT_PORT);
    
  /* Tell the client that we have accepted it */
  udp_send(upcb, p);

  /* free the UDP connection, so we can accept new clients */
  udp_disconnect(upcb);
    
  /* Free the p buffer */
  pbuf_free(p);   
}
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 28.12.2016, 16:43   #3
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Спасибо большое! Как то умудрился я эту строчку потерять.
По TCP пока непонятного много. Буду разбираться и надеяться на Вашу помощь.
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 10:58   #4
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Тяжело понимается как происходит передача данных в TCP эхо сервере.
Разбираю функцию tcp_echoserver_send().
Вот её отрывок:
Код:
while((wr_err==ERR_OK)&&(es->p!=NULL)&&(es->p->len<=tcp_sndbuf(tpcb)))
	{
	// ptr - вспомогательный указатель на pbuf* данных для передачи
	ptr=es->p;
	// Подгружаем данные для передачи
	wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);
	if(wr_err==ERR_OK)
		{
		u16_t plen;
		u8_t freed;
		plen=ptr->len;
		// Продолжить следующим pbuf в цепи (если таковые имеются)
		es->p=ptr->next;
		if(es->p!=NULL)
			{
 			pbuf_ref(es->p);
			}
 		do
			{
			freed=pbuf_free(ptr);
			}
		while(freed==0);
		tcp_recved(tpcb,plen);
		}
	else 
	if(wr_err==ERR_MEM)
		{
		es->p = ptr;
		}
	else
		{
		// Какие то другие проблемы
		}
Функция tcp_sndbuf() возвращает значение поля snd_buf управляющей структуры подключения. С помощью этой функции узнаем колличество байт, которые могут быть добавлены в очередь для отправки функцией tcp_write(). При безошибочном выполнении переходим к следующему дескриптору pbuf* es->p=ptr->next;
Следующие действия связаны с процессом освобождения памяти, занятой переданными данными.
Строка pbuf_ref(es->p); увеличивает поле ref следующего дескриптора, что бы он не высвободился при выполнении функции pbuf_free(ptr); Функция tcp_recved(tpcb,plen); я так и не понял что делает. Что то связанное с менеджером памяти. Может объяснит кто простыми словами?
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 11:44   #5
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Тяжело понимается как происходит передача данных в TCP эхо сервере.
Разбираю функцию tcp_echoserver_send().
Вот её отрывок:
Код:
while((wr_err==ERR_OK)&&(es->p!=NULL)&&(es->p->len<=tcp_sndbuf(tpcb)))
    {
    // ptr - вспомогательный указатель на pbuf* данных для передачи
    ptr=es->p;
    // Подгружаем данные для передачи
    wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);
    if(wr_err==ERR_OK)
Я начинал не с разбора кода, а с поиска способа "обработать принятый пакет, подготовить ответ и отправить его вместо эха".
У меня эта функция такая же, только вместо строк
Код:
// Подгружаем данные для передачи
wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);
Написано (здесь еще код для вывода в UART, в терминальную программу отладочных строк - длина запроса, сам запрос, длина ответа, сам ответ, это все не нужно в работающей программе):
Код:
unsigned short Length = ptr->len;               // Длина запроса.
printf("\n\rRequestLength = %d\n\r", Length);   // Печатаем длину запроса.
char *pRequest = (char*)malloc(Length*3);       // Выделяем память под строку (XX ...XX'\0').
ArrayToASCII(pRequest, ptr->payload, Length);   // Печатаем запрос в HEX виде (XX ...XX'\0')
printf("Request(HEX) = %s\n\r",pRequest);       // Строка в HEX-формате, разделенная пробелами.
free(pRequest);
pRequest=0;
unsigned short Tx = 0;                          // Количество байт на передачу.
Tx = ModbusTCP(ptr->payload, ptr->len);         // Протокол.
wr_err = tcp_write(tpcb, ptr->payload, Tx, 1);  // Записать ответ в стек.
char *pStr = (char*)malloc(Tx*3);               // Выделяем память под строку (XX ...XX'\0').
if(pStr != NULL)                                // Ответ, если существует.
  {
  printf("ResponseLength = %d\n\r",Tx);         // Печатаем длину ответа.
  ArrayToASCII(pStr, ptr->payload, Tx);         // Преобразуем массив в строку в HEX виде (XX ...XX'\0')
  printf("Response(HEX) = %s\n\r",pStr);        // Печатаем ответ. 
  free(pStr);
  }
pStr=0;
Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Функция tcp_recved(tpcb,plen); я так и не понял что делает. Что то связанное с менеджером памяти. Может объяснит кто простыми словами?
Что делает функция tcp_recved() написано в tcp.c
Цитата:
/**
* This function should be called by the application when it has
* processed the data. The purpose is to advertise a larger window
* when the data has been processed.
*
* @param pcb the tcp_pcb for which data is read
* @param len the amount of bytes that have been read by the application
*/
void
tcp_recved(struct tcp_pcb *pcb, u16_t len)
она должна вызываться в программе пользователя, у меня пока не было необходимости разбираться в том, что она делает, должна - значит должна. Сам сейчас разбираюсь в деталях TCP, каждый запрос, побайтно, что для чего, вот с контрольными суммами разобрался, в стеке три варианта функции, я еще свой учебный написал, чтобы было понятно, а что же делает функция расчета контрольной суммы (IP header checksum и TCP checksum, с первой легко, а со второй помучаться пришлось, не мог себе представить такого алгоритма...функции для расчета одинаковые, а пакеты скармливаются разные, один есть в запросе, а второй частично).
PS: Есть чем заняться. Вливайся, чтобы одно и то же по два раза не ковырять. А то особо некому ковырять.
Можно даже в личку перейти, чтобы молчуны не читали.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 29.12.2016 в 11:54.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 11:50   #6
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Спасибо, еще мне непонятен такой момент: функция tcp_sent() назначает функцию обратного вызова, которая будет вызываться LwIP стеком при событии приема ACK от клиента т.е. клиент готов к приему новых данных. Почему не сделать это один раз, при установке соединения? Я сделал, вроде все так же работает, ничего не рушится.
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 11:55   #7
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Я сейчас то же вместо эха отправляю другие данные.
При приеме пакета, после его анализа, я высвобождаю память такой последовательностью:
Код:
// Обработав данные, скажем lwIP что данные получены и их можно стирать и принимать новые. 
// Для этого вызовем функцию tcp_recved
tcp_recved(tpcb,p->tot_len);
// Потом просто освободим память, занимаемую буфером p
pbuf_free(p);
Без вызова tcp_recved() программа рушится (не высвобождается память).
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 11:57   #8
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Спасибо, еще мне непонятен такой момент: функция tcp_sent() назначает функцию обратного вызова, которая будет вызываться LwIP стеком при событии приема ACK от клиента т.е. клиент готов к приему новых данных. Почему не сделать это один раз, при установке соединения? Я сделал, вроде все так же работает, ничего не рушится.
Я пока не знаю, сам разбираюсь в деталях.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 12:20   #9
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

У меня еще совсем глупые вопросы есть. Вот у моего компьютера сейчас в локальной сети сети IP адрес 192.168.1.6 (назначен динамически), а маска подсети 255.255.255.0. Здесь нет противоречия? Я так понимаю, при такой маске IP адреса устройств сети могут быть в диапазоне 192.168.0.0...192.168.0.255.
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 12:22   #10
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Функция tcp_recved(tpcb,plen); я так и не понял что делает. Что то связанное с менеджером памяти. Может объяснит кто простыми словами?
Не прочитанные приложением данные накапливаются в буфере окна TCP соединения.
Размер этого окна задается в lwipopts.h
Пока некоторое количество данных не будет прочитано приложением -
буфер окна занят. Прием новых пакетов невозможен (ACK не уйдет),
передающая сторона знает размер окна (задано при открытии TCP)
и не станет передавать новые пакеты до получения ACK.
Непрочитанный буфер не освобождается в памяти. Хотя это уже скорее недоработка стека а не фича (на мой взгляд).
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 12:26   #11
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Спасибо, еще мне непонятен такой момент: функция tcp_sent() назначает функцию обратного вызова, которая будет вызываться LwIP стеком при событии приема ACK от клиента т.е. клиент готов к приему новых данных. Почему не сделать это один раз, при установке соединения? Я сделал, вроде все так же работает, ничего не рушится.
Тут непонятно что именно вы делаете!
Каждое соединение уникально и существует до своего закрытия.
Для каждого соединения выделены разные pcb и arg в памяти.
Соединение живет до момента его закрытия.
Каждое соединение может иметь свой обработчик tcp_sent().
И если он у вас один для любого TCP соединения - это ваше личное, но необязательное решение.
Устанавливается и хранится оно раздельно для каждой копии TCP соединения.

И да! Не путайте pcb с сокетами!!! Я сделал такую ошибку и потерял немного времени на этом.
Это КОНЦЕПТУАЛЬНО разные вещи. И работают даже отдаленно непохоже друг на друга!

Последний раз редактировалось Petr; 29.12.2016 в 12:33.
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 12:29   #12
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,100
Вес репутации: 3460/73
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
У меня еще совсем глупые вопросы есть. Вот у моего компьютера сейчас в локальной сети сети IP адрес 192.168.1.6 (назначен динамически), а маска подсети 255.255.255.0. Здесь нет противоречия? Я так понимаю, при такой маске IP адреса устройств сети могут быть в диапазоне 192.168.0.0...192.168.0.255.
Маска по "и" накладывается на IP, чтоб получить адрес подсети. Wiki
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 29.12.2016, 12:30   #13
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
У меня еще совсем глупые вопросы есть. Вот у моего компьютера сейчас в локальной сети сети IP адрес 192.168.1.6 (назначен динамически), а маска подсети 255.255.255.0. Здесь нет противоречия? Я так понимаю, при такой маске IP адреса устройств сети могут быть в диапазоне 192.168.0.0...192.168.0.255.
Прочитайте что есть маска подсети!!!
Вы неправильно понимаете ее суть.

Если ваш комп решит послать пакет по любому IP, у которого
младшие биты отличны от битов собственного IP после наложения маски -
реализация TCP/IP операционной системы направит пакет не по указанному IP, а в IP установленного шлюза!
Почему? Да потому, что запрошенный IP находится вне пределов домашней подсети (определено маской) и данный узел располагается ЗА указанным шлюзом.
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 12:45   #14
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 42
Сообщений: 256
Вес репутации: 617/38
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Спасибо, все понятно.
Вот еще вопрос из разряда "стыдно спросить": я хочу чтоб мое устройство (в роли сервера) связывалось с управляющей программой на ПК через локальную сеть. Я ему жестко назначаю IP адрес (например, 192.168.0.200) и порт (например, 50000). Управляющая программа шлет запросы на этот сокет и получает данные. А вдруг этот IP адрес уже динамически выделен какому нибудь пользователю локальной сети. Есть вариант моему устройству получить адрес то же динамически. Но как тогда управляющая программа найдет его? Перебирать весь диапазон локальных IP адресов и ждать "адекватного" ответа на запрос?
Pasha_Bi вне форума   Ответить с цитированием
Старый 29.12.2016, 12:51   #15
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Спасибо, все понятно.
Вот еще вопрос из разряда "стыдно спросить": я хочу чтоб мое устройство (в роли сервера) связывалось с управляющей программой на ПК через локальную сеть. Я ему жестко назначаю IP адрес (например, 192.168.0.200) и порт (например, 50000). Управляющая программа шлет запросы на этот сокет и получает данные. А вдруг этот IP адрес уже динамически выделен какому нибудь пользователю локальной сети. Есть вариант моему устройству получить адрес то же динамически. Но как тогда управляющая программа найдет его? Перебирать весь диапазон локальных IP адресов и ждать "адекватного" ответа на запрос?
http://www.microchip.su/showpost.php...54&postcount=1

Но это не панацея! Есть много способов решения этого вопроса.
Этот тоже неплох именно в локальных сетях.
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 12:51   #16
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
Спасибо, все понятно.
Вот еще вопрос из разряда "стыдно спросить": я хочу чтоб мое устройство (в роли сервера) связывалось с управляющей программой на ПК через локальную сеть. Я ему жестко назначаю IP адрес (например, 192.168.0.200) и порт (например, 50000). Управляющая программа шлет запросы на этот сокет и получает данные. А вдруг этот IP адрес уже динамически выделен какому нибудь пользователю локальной сети. Есть вариант моему устройству получить адрес то же динамически. Но как тогда управляющая программа найдет его? Перебирать весь диапазон локальных IP адресов и ждать "адекватного" ответа на запрос?
Стыдно должно быть тем, кто молчит, кто и вопроса задать не может. Сеть можно сделать с помощью роутера, воткнуть в него все сетевые устройства. Если роутер поддерживает протокол DHCP и в воткнутом девайсе реализована поддержка этого протокола, то IP адрес назначится автоматом (не нужно руками устанавливать). А если DHCP не поддерживается роутером или девайсом, то назначаем ручками и втыкаем в сеть. Предварительно можно просканировать сеть, посмотреть кто есть в сети. Кто-то же должен администрировать эту локальную сеть и знать, какие там устройства, у кого какой IP.
Цитата:
Сообщение от Petr Посмотреть сообщение
http://www.microchip.su/showpost.php...54&postcount=1

Но это не панацея! Есть много способов решения этого вопроса.
Этот тоже неплох именно в локальных сетях.
Петр, я этот код видел, он даже у меня есть, но я еще им не воспользовался. Напиши лучше как его использовать и как это работает (технология), если описание бесплатное.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 12:55   #17
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
А если DHCP не поддерживается роутером или девайсом, то назначаем ручками и втыкаем в сеть. Предварительно можно просканировать сеть, посмотреть кто есть в сети. Кто-то же должен администрировать эту локальную сеть и знать, какие там устройства, у кого какой IP.
Перевожу на человеческий язык: "я не понял вопроса и ответил ерунду".
Уж не обижайся
Хотя можешь и обижаться...
Как хошь, короче.

Есть бесплатное описание в википедии!
А если на пальцах:
Набираешь в браузере "БлаБла/" вместо IP
в адресной строке и жмешь "enter"
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 12:56   #18
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Petr Посмотреть сообщение
Перевожу на человеческий язык: "я не понял вопроса и ответил ерунду".
Уж не обижайся
Хотя можешь и обижаться...
Как хошь, короче.
Да ладно! Все равно раскажи, как пользоваться этим кодом. Интересно же.
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 12:59   #19
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Да ладно! Все равно раскажи, как пользоваться этим кодом. Интересно же.
В main(); до! основного цикла:

Код:
NBNS_init();                                                  //инит NBNS сервера
И радуешься
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 13:41   #20
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Petr Посмотреть сообщение
В main(); до! основного цикла:

Код:
NBNS_init();                                                  //инит NBNS сервера
И радуешься
Я и сам догадался, т.к. функция в файле исходника всего одна. Функция инициализации NBNS. Вроде как имя должно в сети появиться , т.е. не только по IP, но и по имени (из адресной строки браузера) можно обращаться. Так? Если так, то это только для WEB-серверов? Или еще для чего? И чем это имя можно посмотреть, что оно появилось - список таких имен?
PS: Этот NBNS никак не связан с DNS и получением по имени IP адреса?
__________________
Прогресс неизбежен.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 13:48   #21
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Вроде как имя должно в сети появиться - нет.
т.е. не только по IP, но и по имени (из адресной строки браузера) можно обращаться. - да.
Если так, то это только для WEB-серверов? - нет.
Или еще для чего? - да.
И чем это имя можно посмотреть, что оно появилось - список таких имен? - ничем.
Этот NBNS никак не связан с DNS и получением по имени IP адреса? - не связан, но то же самое
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 14:05   #22
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Petr Посмотреть сообщение
Вроде как имя должно в сети появиться - нет.
т.е. не только по IP, но и по имени (из адресной строки браузера) можно обращаться. - да.
Если так, то это только для WEB-серверов? - нет.
Или еще для чего? - да.
И чем это имя можно посмотреть, что оно появилось - список таких имен? - ничем.
Этот NBNS никак не связан с DNS и получением по имени IP адреса? - не связан, но то же самое
Диалог с машиной обслуживания или биороботом. Синтаксический анализатор и поиск ответа в базе данных. Если не знаешь, то генератор случайных чисел выдает ответ да или нет (пытается угадать). Все же лучше, чем ответ "не знаю".
PS: Я понял, почему ты так не многословен про NetBiosName. Вот с сайта фирмы IBM
Цитата:
В сетях SMB/CIFS используется нестандартная схема имен. Хотя для обращения друг к другу современные клиенты могут использовать доменные Интернет-имена, более старые клиенты используют для этого разработанную компанией Microsoft службу Windows Internet Name Service (WINS), которая также известна как сервер имен NetBIOS (NetBIOS Name Server, NBNS).
Устаревшая технология.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 29.12.2016 в 14:17.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 14:15   #23
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
Диалог с машиной обслуживания или биороботом. Синтаксический анализатор и поиск ответа в базе данных. Если не знаешь, то генератор случайных чисел выдает ответ да или нет (пытается угадать). Все же лучше, чем ответ "не знаю".
Это диалог с человеком, строго! не желающим почитать это:
https://en.wikipedia.org/wiki/NetBIOS#NetBIOS_name
Как часть этого:
https://ru.wikipedia.org/wiki/NetBIOS
Petr вне форума   Ответить с цитированием
Старый 29.12.2016, 14:25   #24
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Orel
Возраст: 38
Сообщений: 4,418
Вес репутации: 4322/119
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Petr Посмотреть сообщение
Это диалог с человеком, строго! не желающим почитать это:
https://en.wikipedia.org/wiki/NetBIOS#NetBIOS_name
Как часть этого:
https://ru.wikipedia.org/wiki/NetBIOS
У IBM написано, что эта служба называется Windows Internet Name Service
Цитата:
WINS — это аналог DNS для NetBIOS. В операционной системе Linux протокол NetBIOS отсутствует.
Цитата:
Протокол NetBIOS ещё на заре Windows стал частью фундамента этой системы.
Цитата:
Amazingly, NetBIOS is actually still used in the trust creation process, even though Microsoft has officially "deprecated" NetBIOS in versions of Windows from 2000 on.
Получается, что уже лет 17 протокол NetBIOS считается устаревшим.
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 29.12.2016 в 14:39.
Pridnya вне форума   Ответить с цитированием
Старый 29.12.2016, 14:43   #25
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 46
Сообщений: 1,734
Вес репутации: 3438/90
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: LwIP для STM32. Вопрос по освобождению памяти при приеме данных.

Цитата:
Сообщение от Pridnya Посмотреть сообщение
У IBM написано, что эта служба называется Windows Internet Name Service
Так "подними" в сети DNS сервер и не парь мозги ни себе ни контроллеру
И главное - никакого бродкаста в сети не будет шляться. Красота. Все админы будут писать кипятком.

Но мне такой подход (бродкасты) нравится. Нормальный вариант для мелких сетей с такими контроллерами.
Небольшой рихт этого "сервера" позволяет сделать опрос сети
с получением списка активных устройств весьма просто и незатейливо.

А соблюдение стандарта позволяет пользоваться этими именами
в локалках (без озабоченных админов) на всех платформах
(включая Linux конечно, поскольку он начал поддерживать NetBIOS лет 20 назад) на сегодня.
А что будет в Windows 11 - мне начхать.
10-ка NBNS поддерживает.
Petr вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
MPLAB не находит c018i.o qwerty1 Продукция MICROCHIP 45 22.04.2011 12:14
Помогите с интерфейсом I2C maxNTF Продукция MICROCHIP 34 23.03.2009 12:45
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 03:34.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot