FULL-C dns resolv functions: Porovnání verzí

(Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk '''FULL-C''', který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C,…“)
 
Řádek 35: Řádek 35:
 
  printf("RESOLVING %s \n", DNSname);
 
  printf("RESOLVING %s \n", DNSname);
  
 +
// start - select the new DNSname for all the subsequent status function calls
 
  dns_resolv(DNSname);
 
  dns_resolv(DNSname);
  
 +
// get the first status value
 
  status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
 
  status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
  while (status == 512)
+
// only if truly working, keep waiting
 +
  while (512 == status)
 
  {
 
  {
 +
  // keep getting a new status, until it is different than 512
 
   status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
 
   status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
 
  }
 
  }
  
  if (status == 513)
+
// check the final status value
 +
  if (513 == status)
 
  {
 
  {
 
   printf("GOT RESULT: IP = %u.%u.%u.%u\n", IP0, IP1, IP2, IP3);
 
   printf("GOT RESULT: IP = %u.%u.%u.%u\n", IP0, IP1, IP2, IP3);
 +
  // only in this case, we can use the IPx address
 +
  // ... OK
 +
 +
  // we can print the additional internal DNS cache status, for this particular domain
 +
  // note. the value is valid only if the status is 512, otherwise not
 +
  unsigned int ttl;
 +
  ttl = SDS_get_u(70); // index [70] = actual TTL value for the selected DNS cache item
 +
  printf("DNS CACHE TTL VALUE IS %u SECONDS FOR DOMAIN %s\n", ttl, DNSname);
 
  } else
 
  } else
 
  {
 
  {
 
   printf("DNS RESOLV FAILED (error %u) \n", status);
 
   printf("DNS RESOLV FAILED (error %u) \n", status);
 +
  // in this case, the IPx adress is not valid, and you need to repeat the dns_resolv() call again
 
  }
 
  }
  
 
}
 
}
 
</pre>
 
</pre>
 +
 +
== Interní DNS cache ==
 +
 +
Po úspěšném provedení získání DNS překladu, kdy SDS odešle dotaz na určený DNS server, a získá z něj odpověď,
 +
je výsledek k dispozici (dá se získat pomocí dns_resolv_status funkce).
 +
 +
Funkce dns_resolv_status() vrací vždy výsledek toho úplně posledního dotazu, který byl vyvolán zavoláním funkce dns_resolv().
 +
 +
Platná odpověď z DNS serveru je uložena do interní tabulky (DNS cache) v SDS.
 +
 +
Pokud je zbývající hodnota TTL větší než 0, bude ihned k dispozici odpověď z interní cache.
 +
 +
Pokud záznam v interní cache není (nebo už vypršel), bude automaticky odeslána žádost o nový překlad na DNS server.
 +
 +
Toto si řídí SDS interně.
 +
 +
Váš program tedy vždy, když potřebuje IP adresu pro jakoukoliv doménu, tak vždy musí nejprve zavolat dns_resolv(). Tím se jednak vybere aktuální doména, pro kterou chcete získat platnou aktuální IP adresu (a lze ji tedy přečíst pomocí dns_resolv_status() funkce), a také se spustí mechanismus kontroly interní cache a eventuálního odeslání nového dotazu.
 +
 +
Nový dotaz není odeslán automaticky, tedy SDS samo neodesílá nové dotazy, když položka v interní DNS cache vyprší. Toto máte plně pod kontrolou vy, a to tak, že voláte funkci dns_resolv(), která se teprve v ten moment (kdy ji ze svého programu zavoláte) rozhodne, jestli bude nový dotaz posílat, nebo ne (čistě dle stavu obsahu interní DNS cache). Pokud v cache není záznam pro danou doménu, nebo je ale už vypršel (TTL na nule), tak dojde k odeslání dotazu, a váš program pak musí čekat na odpověď (viz příklad výše, periodickým voláním dns_resolv_status(), kdy se průběžně zařídí dle vrácené hodnoty od této funkce).
 +
 +
 +
== Upozornění ==
 +
 +
Starší FW mělo bug, kdy při vypršení TTL v interní cache nedošlo ke smazání položky v interni cache. Toto je samozřejmě problém, který je vyřešen v novém firmware.
 +
 +
DNS cache je (záměrně) vymazána při:
 +
* nahrání nového FULLC programu
 +
* restartu zařízení SDS
 +
 +
DNS cache není vymazána při výpadku Ethernetového připojení.
 +
 +
DNS cache lze ručně vymazat zapsáním hodnoty 0xE4A5ECAC do systémové proměnné na indexu [70]. Zápis této speciální hodnoty kompletně smaže interní DNS cache. Tato specifická funkcionalita vyžaduje aktuální firmware (bylo to přidáno až 08/2025).
  
  
 
== Stavové hodnoty ==
 
== Stavové hodnoty ==
  
Program musí použít volání funkce '''dns_resolv_status''' pro zjištění okamžitého stavu.
+
Program musí použít volání funkce '''dns_resolv_status''' pro zjištění okamžitého stavu. Dokud nezískáte finální stavovou hodnotu, musíte tuto funkci volat opakovaně (nezapomeňte na vlastní bezpečnostní timeout).
  
 
   dns_resolv_status()      význam
 
   dns_resolv_status()      význam
  -------------------------+-----------------------------------------------------------------------
+
  -------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------
   0                      |  klid, můžete odeslat DNS dotaz
+
   0                      |  klid, můžete odeslat DNS dotaz, funkce dns_resolv_status() současně nevrací platnou IP adresu (musíte nejprve spustit DNS překlad)
   512                    |  pracuje, dotaz odeslán, čekejte
+
   512                    |  pracuje, dotaz odeslán (překlad nenalezen v interní cache), čekejte (funkce současně nevrací platnou IP adresu, ta bude až po dokončení překladu)
   513                    |  hotovo OK, do *resolvedIPaddressOutput byla zapsána IP adresa (4 bajty)
+
   513                    |  hotovo OK, do *resolvedIPaddressOutput byla zapsána IP adresa (4 bajty), a záznam v interní cache je platný a živý (zbývající TTL větší než 0)
   514                    |  odpověď nebyla získána (chyba)
+
   514                    |  odpověď nebyla získána (chyba) a současně nemáme záznam v interní DNS cache, takže funkce nevrací platnou IP adresu (musíte znovu začít s dotazem)
   515                    |  funkce byla zavolána s neplatnými parametry - nic nebylo provedeno
+
   515                    |  funkce byla zavolána s neplatnými parametry - nic nebylo provedeno, funkce nevrací platnou IP adresu
 +
 
 +
 
 +
Pokud funkce dns_resolv_status() vrátila hodnotu 513, je možné číst systémovou proměnnou z indexu [70] (uint32_t), která ukáže hodnotu TTL v momentu, kdy tuto hodnotu právě čtete. Lze takto sledovat, jak se postupně TTL snižuje (o 1 každou sekundu). Hodnota TTL odpovídá dané položce v interní cache, která byla určena právě posledním voláním funkce dns_resolv().

Verze z 10. 8. 2025, 09:01

Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Síťové funkce: dotaz na přidělenou IP adresu pro DNS jméno

Zařízení SDS umožňuje odeslat dotaz na DNS server, za účelem zjištění IP adresy přidělené k DNS názvu, který je obsahem právě takového dotazu.

Za tímto účelem jsou k dispozici tyto dvě funkce:

         void dns_resolv(char *domainNameInput);
 unsigned int dns_resolv_status(unsigned int *IP0value, unsigned int *IP1value, unsigned int *IP2value, unsigned int *IP3value);

Princip

SDS odesílá dotaz na DNS server, který je nastaven uživatelem SDS ve webové administraci zařízení (popř. je adresa DNS serveru získána z DHCP serveru, opět záleží na konfiguraci).

Po odeslání dotazu se čeká na odpověď, přičemž FULL-C program pravidelně kontroluje stav voláním dns_resolv_status() funkce.


Příklad

V tomto příkladu odesílá SDS dotaz (textový název domény) na DNS server a zobrazuje případnou získanou odpověď (IP adresu).

void main(void)
{
 char DNSname[64];
 unsigned int status;
 unsigned int IP0, IP1, IP2, IP3;

 sprintf((char *)DNSname, "www.google.com");

 printf("RESOLVING %s \n", DNSname);

 // start - select the new DNSname for all the subsequent status function calls
 dns_resolv(DNSname);

 // get the first status value
 status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
 // only if truly working, keep waiting
 while (512 == status)
 {
   // keep getting a new status, until it is different than 512
   status = dns_resolv_status(&IP0, &IP1, &IP2, &IP3);
 }

 // check the final status value
 if (513 == status)
 {
   printf("GOT RESULT: IP = %u.%u.%u.%u\n", IP0, IP1, IP2, IP3);
   // only in this case, we can use the IPx address
   // ... OK

   // we can print the additional internal DNS cache status, for this particular domain
   // note. the value is valid only if the status is 512, otherwise not
   unsigned int ttl;
   ttl = SDS_get_u(70); // index [70] = actual TTL value for the selected DNS cache item 
   printf("DNS CACHE TTL VALUE IS %u SECONDS FOR DOMAIN %s\n", ttl, DNSname);
 } else
 {
   printf("DNS RESOLV FAILED (error %u) \n", status);
   // in this case, the IPx adress is not valid, and you need to repeat the dns_resolv() call again
 }

}

Interní DNS cache

Po úspěšném provedení získání DNS překladu, kdy SDS odešle dotaz na určený DNS server, a získá z něj odpověď, je výsledek k dispozici (dá se získat pomocí dns_resolv_status funkce).

Funkce dns_resolv_status() vrací vždy výsledek toho úplně posledního dotazu, který byl vyvolán zavoláním funkce dns_resolv().

Platná odpověď z DNS serveru je uložena do interní tabulky (DNS cache) v SDS.

Pokud je zbývající hodnota TTL větší než 0, bude ihned k dispozici odpověď z interní cache.

Pokud záznam v interní cache není (nebo už vypršel), bude automaticky odeslána žádost o nový překlad na DNS server.

Toto si řídí SDS interně.

Váš program tedy vždy, když potřebuje IP adresu pro jakoukoliv doménu, tak vždy musí nejprve zavolat dns_resolv(). Tím se jednak vybere aktuální doména, pro kterou chcete získat platnou aktuální IP adresu (a lze ji tedy přečíst pomocí dns_resolv_status() funkce), a také se spustí mechanismus kontroly interní cache a eventuálního odeslání nového dotazu.

Nový dotaz není odeslán automaticky, tedy SDS samo neodesílá nové dotazy, když položka v interní DNS cache vyprší. Toto máte plně pod kontrolou vy, a to tak, že voláte funkci dns_resolv(), která se teprve v ten moment (kdy ji ze svého programu zavoláte) rozhodne, jestli bude nový dotaz posílat, nebo ne (čistě dle stavu obsahu interní DNS cache). Pokud v cache není záznam pro danou doménu, nebo je ale už vypršel (TTL na nule), tak dojde k odeslání dotazu, a váš program pak musí čekat na odpověď (viz příklad výše, periodickým voláním dns_resolv_status(), kdy se průběžně zařídí dle vrácené hodnoty od této funkce).


Upozornění

Starší FW mělo bug, kdy při vypršení TTL v interní cache nedošlo ke smazání položky v interni cache. Toto je samozřejmě problém, který je vyřešen v novém firmware.

DNS cache je (záměrně) vymazána při:

  • nahrání nového FULLC programu
  • restartu zařízení SDS

DNS cache není vymazána při výpadku Ethernetového připojení.

DNS cache lze ručně vymazat zapsáním hodnoty 0xE4A5ECAC do systémové proměnné na indexu [70]. Zápis této speciální hodnoty kompletně smaže interní DNS cache. Tato specifická funkcionalita vyžaduje aktuální firmware (bylo to přidáno až 08/2025).


Stavové hodnoty

Program musí použít volání funkce dns_resolv_status pro zjištění okamžitého stavu. Dokud nezískáte finální stavovou hodnotu, musíte tuto funkci volat opakovaně (nezapomeňte na vlastní bezpečnostní timeout).

 dns_resolv_status()       význam
-------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------
 0                       |  klid, můžete odeslat DNS dotaz, funkce dns_resolv_status() současně nevrací platnou IP adresu (musíte nejprve spustit DNS překlad)
 512                     |  pracuje, dotaz odeslán (překlad nenalezen v interní cache), čekejte (funkce současně nevrací platnou IP adresu, ta bude až po dokončení překladu)
 513                     |  hotovo OK, do *resolvedIPaddressOutput byla zapsána IP adresa (4 bajty), a záznam v interní cache je platný a živý (zbývající TTL větší než 0)
 514                     |  odpověď nebyla získána (chyba) a současně nemáme záznam v interní DNS cache, takže funkce nevrací platnou IP adresu (musíte znovu začít s dotazem)
 515                     |  funkce byla zavolána s neplatnými parametry - nic nebylo provedeno, funkce nevrací platnou IP adresu


Pokud funkce dns_resolv_status() vrátila hodnotu 513, je možné číst systémovou proměnnou z indexu [70] (uint32_t), která ukáže hodnotu TTL v momentu, kdy tuto hodnotu právě čtete. Lze takto sledovat, jak se postupně TTL snižuje (o 1 každou sekundu). Hodnota TTL odpovídá dané položce v interní cache, která byla určena právě posledním voláním funkce dns_resolv().