STM Урок 131. LAN8742A. LWIP. SOCKET. UDP Server. Часть 2



В предыдущей части урока мы познакомились с интерфейсом SOCKET, создали и настроили проект и проверили доступ к сетевому интерфейсу нашего сервера.

 

Теперь займёмся наконец-то непосредственно нашим сервером.

В функции задачи добавим несколько локальных переменных, указателей и массив

 

Затем определим размер адресной структуры

 

Удалим бесконечный цикл с задержкой и попытаемся создать сокет

 

Первый параметр функции создания сокета — это протокол сетевого уровня — протокол IP версии 4. Второй параметр — это тип сокета по протоколу транспортного уровня, так как мы работаем с протоколом UDP, то мы работаем не с байтовыми потоками, а с сообщениями или датаграммами, поэтому именно такой параметр. Третий параметр — это конкретный протокол транспортного уровня. В принципе его можно не указывать в нашем случае и написать 0 — всё будет работать.

 

 

В теле условия, если сокет нормально создался и функция создания получила неотрицательный дескриптор сокета, мы произведём инициализацию адресной структуры

 

Здесь мы также задали тот же тип сетевого протокола, занесли наш порт из параметра задачи и присвоили сетевой адрес.

Затем свяжем наш сокет с данной адресной структурой

 

Если связь не удалась, то мы вызовем функцию уничтожения (закрытия) сокета и выйдем из задачи.

 

 

А если всё нормально, то создадим бесконечный цикл и в нём попытаемся принять пакет от клиента

 

функция приёма в параметрах содержит дескриптор нашего сокета, указатель на буфер, в который будут приниматься данные, длину этого буфера указатель на адресную структуру, в которую попадут все адреса клиента, а также указатель на размер адресной структуры, который мы вычислили заранее.

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

 

Затем добавим в конце строки опять перевод строки и отправим наш буфер обратно клиенту в качестве эха

 

Соберём код, прошьём контроллер, запустим программу netcat, объявив в параметрах адрес нашего сервера, а также порт

Запустим также Wireshark и отфильтруемся там по адресу IP сервера.

Попробуем что-нибудь передать серверу

Всё прекрасно передалось.

Посмотрим также передачу в анализаторе трафика

Там также всё отлично, ничего лишнего не передаётся, пакеты короткие.

Теперь посмотрим на дисплей нашего сервера

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

Попробуем создать ещё несколько соединений в Netcat, запустив несколько сессий и передать из каждой из них сообщение серверу

Мы видим, что всё отлично работает и с четырьмя различными клиентами. То что они различные, мы можем убедиться, посмотрев информацию на дисплее — там у всех сообщений разные порты клиента

Таким образом, в данном уроке мы познакомились с новым для нас интерфейсом стека протоколов LWIP — SOCKET, научились создавать на нём простейший UDP-сервер, также мы сегодня познакомились со схемой распределения памяти в операционной системе FREERTOS — heap_5, использование которой позволило нам работать с участками памяти в нужных местах и увеличить практически вдвое размер кучи для операционной системы.

С интерфейсом (API) SOCKET нам предстоит ещё много работы в следующих уроках, в которых мы познакомимся с многими его особенностями, позволяющими упростить написание кода для сети, а также упорядочить многие сетевые процессы.

Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LAN8742A. LWIP. SOCKET. UDP Server

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*