Шаг 1: пример кода для интерфейса Ethernet

Внимание

Этот раздел сейчас дорабатывается. Приносим извинения за неудобства. Если вам нужна срочная помощь, обратитесь в службу поддержки Tibbo.

Этот и другие проекты из раздела примеров кода опубликованы на сайте Tibbo под названием «test_dhcp_lib».

Вот простой пример использования DHCP на интерфейсе Ethernet (net.). Обратите внимание, как реализована процедура callback_dhcp_ok()! Это хорошая иллюстрация к пространным объяснениям в разделе Подробности работы (не то чтобы мы рассчитывали, что вы прочтёте их целиком).

Обратите внимание и на определение NET_AVAILABLE. Оно приходит от платформы. Если на выбранной платформе есть интерфейс Ethernet, NET_AVAILABLE равно «1». Аналогично, если есть интерфейс Wi-Fi, WLN_AVAILABLE равно «1». С такими определениями можно создавать приложения, которые компилируются на любой платформе, лишь бы на ней был хотя бы интерфейс Ethernet или Wi-Fi.

Вот пример отладочного вывода, полученного после запуска этого кода:

DHCP(net)> —-START---DHCP(net)> TX discovery messageDHCP(net)> RX offer messageDHCP(net)> TX request messageDHCP(net)> RX confirmation messageDHCP(net)> ---OK(ip: 192.168.1.246, gateway: 192.168.1.1, netmask: 255.255.255.0, lease: 529200 sec.)---
Внимание

Если вы компилируете проект на одной из платформ «W» (то есть платформ с Wi-Fi), объект wln. нужно отключить, иначе проект не скомпилируется. Выберите Project -> Settings -> Customize и установите объект Wi-Fi (wln.) в значение «Disabled».

А вот и сам код...

'DEFINES-------------------------------------------------------------
#define DHCP_DEBUG_PRINT 1 'to see debug output by the DHCP lib
'INCLUDES------------------------------------------------------------
include "sock\trunk\sock.tbh" 'this lib is necessary for the DHCP lib's operation
include "dhcp\trunk\dhcp.tbh"
include "global.tbh"
'====================================================================
sub on_sys_init()
 #if NET_AVAILABLE
         dhcp_start(PL_SOCK_INTERFACE_NET,"","")
 #endif
end sub
'--------------------------------------------------------------------
sub on_sys_timer()
 dhcp_proc_timer()
end sub
'--------------------------------------------------------------------
sub on_sock_data_arrival()
 dhcp_proc_data()
end sub
include "global.tbh"
'====================================================================
sub callback_dhcp_ok(renew as no_yes, interface as pl_sock_interfaces, byref ip as string, byref gateway_ip as string, byref netmask as string, lease_time as dword)
 dim f as byte
 #if NET_AVAILABLE
         if interface=PL_SOCK_INTERFACE_NET then
                 if renew=YES and net.ip<>ip then
                         'this is a lease renewal and the DHCP server has issues new IP
                         'it is better to reboot than deal with the implications of the changed IP
                         sys.reboot
                 end if
                 if net.ip<>ip then
                         'no need to close sockets -- this is definitely NOT a renewal an the DHCP lib
                         'has already closed all socket connections on this interface prior to setting
                         'the IP to 0.0.0.0
                         net.ip=ip
                         net.gatewayip=gateway_ip
                         net.netmask=netmask
                 end if
         end if
 #endif
end sub
'--------------------------------------------------------------------
sub callback_dhcp_failure(interface as pl_sock_interfaces,failure_code as en_dhcp_status_codes)
end sub
'--------------------------------------------------------------------
sub callback_dhcp_pre_clear_ip(interface as pl_sock_interfaces)
end sub
'--------------------------------------------------------------------
sub callback_dhcp_pre_buffrq(required_buff_pages as byte)
end sub
'--------------------------------------------------------------------
sub callback_dhcp_buff_released()
end sub
Исходный материал Tibbo обновлён 1 августа 2025Оригинал на docs.tibbo.com · Сообщить об ошибке