<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>https://wiki.merenienergie.cz/subdom/wiki/index.php?action=history&amp;feed=atom&amp;title=FULL-C%3A_ping_functions</id>
	<title>FULL-C: ping functions - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.merenienergie.cz/subdom/wiki/index.php?action=history&amp;feed=atom&amp;title=FULL-C%3A_ping_functions"/>
	<link rel="alternate" type="text/html" href="https://wiki.merenienergie.cz/subdom/wiki/index.php?title=FULL-C:_ping_functions&amp;action=history"/>
	<updated>2026-06-13T17:58:22Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.merenienergie.cz/subdom/wiki/index.php?title=FULL-C:_ping_functions&amp;diff=342&amp;oldid=prev</id>
		<title>Adamn: 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,…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.merenienergie.cz/subdom/wiki/index.php?title=FULL-C:_ping_functions&amp;diff=342&amp;oldid=prev"/>
		<updated>2021-08-08T14:26:23Z</updated>

		<summary type="html">&lt;p&gt;Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk &amp;#039;&amp;#039;&amp;#039;FULL-C&amp;#039;&amp;#039;&amp;#039;, který je dostupný na vybraných zařízeních SDS.   Některá zařízení používají SDS-C,…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt; Tato stránka popisuje programovací jazyk '''FULL-C''', který je dostupný na vybraných zařízeních SDS. &lt;br /&gt;
 Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.&lt;br /&gt;
&lt;br /&gt;
== Síťové funkce: odesílání ICMP PING paketů ==&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Zařízení SDS umožňuje odeslat ICMP ECHO REQUEST paket, a přijmout ICMP ECHO REPLY paket.&lt;br /&gt;
&lt;br /&gt;
Za tímto účelem jsou k dispozici tyto dvě funkce:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         void ping_send(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int sendPingSequenceValue);&lt;br /&gt;
 unsigned int ping_send_status(unsigned int * pingReceivedSequence, unsigned int * pingReceivedRTTmsec);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proměnné IP0 až IP3 skládají (po částech) dohromady konkrétní IPv4 adresu, na kterou je ICMP ECHO REQUEST poslán.&lt;br /&gt;
&lt;br /&gt;
== Princip ==&lt;br /&gt;
&lt;br /&gt;
SDS odesílá jeden paket, tzv. ICMP REQUEST. Na tento paket má zareagovat cílový stroj (podle zvolené IP adresy) a odpovědět správně sestaveným ICMP ECHO REPLY (ECHO RESPONSE) paketem.&lt;br /&gt;
&lt;br /&gt;
Aby se různé odpovědi navzájem nepomíchali, je v REQUEST paketu uvedena hodnota číselné sekvence, a tato hodnota je pak vrácena v REPLY (RESPONSE) paketu. Takto může (správně napsaný) FULL-C program srovnat obdrženou odpověď s tím, co poslal za dotaz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Příklad ==&lt;br /&gt;
&lt;br /&gt;
V tomto příkladu odesílá SDS jeden ICMP ECHO REQUEST paket na určenou IP (ip1.ip2.ip3.ip4) a čeká, dokud nepřijde odpověď - potom napíše do konzole hodnotu RTT (Round Trip Time) v milisekundách.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	unsigned int status, oldstatus;&lt;br /&gt;
&lt;br /&gt;
	unsigned int pingSequence;&lt;br /&gt;
	unsigned int gotSeq;&lt;br /&gt;
&lt;br /&gt;
	unsigned int gotRTT;&lt;br /&gt;
&lt;br /&gt;
	unsigned char ip1, ip2, ip3, ip4;&lt;br /&gt;
&lt;br /&gt;
	// PRO NAS PRIKLAD:&lt;br /&gt;
	// ip1, ip2, ip3, ip4 =&amp;gt; jednotlive casti IP adresy cilového stroje (TRAP RECEIVER)  tzn.:  ip1.ip2.ip3.ip4 (např. zde v tomto příkladu 192.168.1.110)&lt;br /&gt;
	 ip1 = 192;&lt;br /&gt;
	 ip2 = 168;&lt;br /&gt;
	 ip3 = 1;&lt;br /&gt;
	 ip4 = 110;&lt;br /&gt;
	// sequence =&amp;gt; zacneme na 1, postupne se zvysuje pro kazdy pokus&lt;br /&gt;
	 pingSequence = 1;&lt;br /&gt;
	// ---&lt;br /&gt;
&lt;br /&gt;
	// musime zacit s hodnotou 2 (pozadavek na opakovane odeslani)&lt;br /&gt;
	status = 2;&lt;br /&gt;
&lt;br /&gt;
	// &amp;quot;oldstatus&amp;quot; je zde pouze pro debug (printf)&lt;br /&gt;
	oldstatus = status + 1;&lt;br /&gt;
&lt;br /&gt;
	// smycka pro obsluhu jednoho PINGu (dokud se to nepovede odeslat)&lt;br /&gt;
	while (status == 2)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		printf(&amp;quot;calling: ping_send(IP, %d)\n&amp;quot;, pingSequence);&lt;br /&gt;
&lt;br /&gt;
		// pozadame SDS o odeslani ICMP PING&lt;br /&gt;
		ping_send(ip1, ip2, ip3, ip4, pingSequence);&lt;br /&gt;
&lt;br /&gt;
		// pockame, dokud neni PING odeslan a dokud nedostanem i odpoved (ECHO)&lt;br /&gt;
		while (status != 8)&lt;br /&gt;
		{&lt;br /&gt;
			gotSeq = 0;&lt;br /&gt;
			gotRTT = 0xFFFFFFFF;&lt;br /&gt;
			status = ping_send_status(&amp;amp;gotSeq, &amp;amp;gotRTT);&lt;br /&gt;
&lt;br /&gt;
			if (status != oldstatus)&lt;br /&gt;
			{&lt;br /&gt;
				oldstatus = status;&lt;br /&gt;
				printf(&amp;quot;PING: status=%d   gotSeq=%d   gotRTT=%u\n&amp;quot;, status,&lt;br /&gt;
						gotSeq, gotRTT);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (status == 8)&lt;br /&gt;
			{&lt;br /&gt;
				// hotovo - musime skoncit 'while' smycku uz tady&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// stale cekam&lt;br /&gt;
			if (0) // if (timeout)  &amp;lt;--- toto si musite udelat sami&lt;br /&gt;
			{&lt;br /&gt;
				printf(&amp;quot;vyprsel cas kdy jsme cekali na odpoved (echo) \n&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// posledni dulezity test:&lt;br /&gt;
			if (status == 2)&lt;br /&gt;
			{&lt;br /&gt;
				// misto ICMP PING byl odeslan ARP dotaz&lt;br /&gt;
				// takze musime chvili pockat a pak odeslat PING na stejnou IP znova&lt;br /&gt;
				// (doufame ze uz prisla ARP odpoved)&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			//&lt;br /&gt;
			;// delej neco jiného, zatimco se ceka . . .&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// v tuto chvili je 'status' vyplnen finalni hodnotou&lt;br /&gt;
&lt;br /&gt;
		if (status == 8)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;ECHO received: ROUND TRIP TIME = %u msec\n&amp;quot;, gotRTT);&lt;br /&gt;
		} else&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;ECHO neprijato (PING bez odpovedi) \n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// a pro dalsi pokus pouzijeme jinou sekvenci ! toto je dulezite.&lt;br /&gt;
		pingSequence++;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;-done-&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Výstupem příkladu může být například toto (když se vše povedlo, a SDS obdrželo ECHO REPLY):&lt;br /&gt;
&lt;br /&gt;
 calling: ping_send(IP, 1)&lt;br /&gt;
 PING: status=1 gotSeq=-1 gotRTT=65535&lt;br /&gt;
 PING: status=4 gotSeq=-1 gotRTT=65535&lt;br /&gt;
 PING: status=8 gotSeq=1 gotRTT=3&lt;br /&gt;
 ECHO received: ROUND TRIP TIME = 3 msec&lt;br /&gt;
 -done-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stavové hodnoty ==&lt;br /&gt;
&lt;br /&gt;
Program musí použít volání funkce '''ping_send_status''' pro zjištění &lt;br /&gt;
okamžitého stavu.&lt;br /&gt;
&lt;br /&gt;
  ping_send_status()         význam&lt;br /&gt;
 -------------------------+-----------------------------------------------------------------------&lt;br /&gt;
  0                       |  klid, můžete odeslat ICMP PING REQUEST&lt;br /&gt;
  1                       |  pracuje, paket bude odeslán, čekejte&lt;br /&gt;
  2                       |  místo PING REQUEST paketu byl odeslán ARP, takže musíte zopakovat odesílání&lt;br /&gt;
  4                       |  PING REQUEST byl úspěšně odeslán (takže čekejte na příjem ECHO REPLY paketu)&lt;br /&gt;
  8                       |  odpověď (ECHO REPLY) se správnou sekvencí byla přijata, hodnota RTT je k dispozici&lt;br /&gt;
  128                     |  paket nebyl odeslán, protože byla zadána neplatá IP adresa&lt;/div&gt;</summary>
		<author><name>Adamn</name></author>
	</entry>
</feed>