<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=256221&amp;view=findpost&amp;p=3746449</guid>
        <pubDate>Sun, 22 Oct 2017 19:27:10 +0000</pubDate>
        <title>Организация алгоритма протокола определения адрессов</title>
        <link>https://forum.sources.ru/index.php?showtopic=256221&amp;view=findpost&amp;p=3746449</link>
        <description><![CDATA[balu1: did you still have the issue]]></description>
        <author>balu1</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=256221&amp;view=findpost&amp;p=2114542</guid>
        <pubDate>Thu, 13 Nov 2008 13:36:55 +0000</pubDate>
        <title>Организация алгоритма протокола определения адрессов</title>
        <link>https://forum.sources.ru/index.php?showtopic=256221&amp;view=findpost&amp;p=2114542</link>
        <description><![CDATA[bizisoft: Здравствуйте.<br>
<br>
Помогите пожалуйста разобраться с алгоритмом протокала определения адресов Ethernet (ARP).<br>
<br>
Имеется следующее задание (перевод с англ. возможно что не так прошу меня извинить):<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Программирование Ethernet, IP и C<br>
<br>
Кратко, задача состоит в том, чтобы cпроектировать рабочий алгоритм протокола определения адресов, подходящий для выполнения в связанном сетью хосте с единственным{отдельным} сетевым адаптером.<br>
Протокол определения адресов (ARP) главным образом используется устройствами, связанными с сетью Ethernet. ARP - протокол, используется для нахождения аппаратного адреса, соответствующего определенному IP адресу. Два устройства, соединенные в сети Ethernet, должны знать адрес аппаратных средств передачи. ARP решает эту проблему динамически. <br>
Тестовое задание должно быть выполнено на язык программирования - чистый ANSI C. Не разрешается использование C++ или встроенного ассемблерного кода. Допустимые источники - RFC 826, “An Ethernet ARP” (включенные в этот архив), RFC 791, “ Internet Протокол ”, и файлы руководств/справки для стандартных libc-функций.<br>
<br>
Следующий раздел требует чтения и понимания RFC 826.<br>
Генерал<br>
Тест не требует интерфейса сетевой связи. Множество включенных функций будет эмулировать сетевую функциональность и деятельность. Кроме того, тест не требует множественный сетевой интерфейс.<br>
Программа должна быть способна ответить на полученные запросы ARP (протокола определения адресов), так же как и быть способной послать ему собственные запросы.<br>
Размер ARP кэша ограничен восьмью входами для упрощенной диагностики, хотя это будет обычно содержать тысячи входов.<br>
&quot;Время жизни&quot; для входа ARP ограничено 30 секундами для упрощенной диагностики, хотя это - обычно не менее 10 раз этого значения.<br>
Код ANSI C должен быть понятный и откомпилирован с наивысшим уровнем предупреждения, без генерирования предупреждений, например с &quot; - wall&quot; в GCC или 3-м уровнем предупреждения в MSVC. (однако 4-й уровень, генерирует предупреждения заголовках libc-файлов.) <br>
Код должен быть отказоустойчивым, рабочий и доступный. Все возможные  ошибки должны управляться в пути, которым компьютер продолжит работать с минимальными сбоями в процессе связи.<br>
Не допускается использование malloc (), free() или аналогичных функций. Единственным исключением является функции ARP_Init() и/или ARP_Cleanup().<br>
Код должен брать ”упорядочивающий байт” в рассмотрение. Все определенные числа протокола должны быть “наиболее значительным первым байтом”, в соответствии с сетевыми стандартами.<br>
Основные типы данных<br>
Следующие основные типы данных определены в ”typedefs.h”:<br>
BYTE - символ без знака<br>
WORD - короткий int без знака<br>
DWORD - длинный int без знака<br>
PVOID - пусто *<br>
<br>
IPADDR - struct {BYTE v [4];}<br>
PIPADDR - IPADDR *<br>
ENETADDR - struct {BYTE v [6];}<br>
PENETADDR - ENETADDR *<br>
Ethernet<br>
Каждый пакет, который посылают в сеть Ethernet, имеет общую структуру в пределах первых четырнадцати байтов; заголовок Ethernet. Этот заголовок содержит &quot;Адрес Назначения&quot; полей, “Адрес Отправителя” и &quot;Протокол&quot;. Адреса - адреса Ethernet на 48 битов, поле протокола - 16-разрядное целое число. Единственный протокол, представляющий интерес в этом испытании 0x0806 (ARP).<br>
typedef struct tagENETHDR<br>
{<br>
  ENETADDR HwDest;<br>
  ENETADDR HwSender;<br>
  WORD wProto;<br>
} ENETHDR, *PENETHDR;<br>
Предопределенные Функции<br>
Некоторые функции уже написаны, чтобы снабдить Вас стандартным интерфейсом. Вы не должны читать код для этих функций, и не при каких обстоятельствах не изменять их.<br>
PIPADDR Iface_GetIPAddress (void)<br>
Возвращает указатель на IPADDR struct, содержащий адрес IP компьютера. Эта функция принята, чтобы быть быстрым и надежным.<br>
PENETADDR Iface_GetENetAddress (void)<br>
Возвращает указатель на ENETADDR struct, содержащий аппаратный адрес сетевого интерфейса. Эта функция принята, чтобы быть быстрым и надежным.<br>
void  Iface_Send (PVOID pData, DWORD dwLen)<br>
Посылает пакет, содержащий необработанные данные Ethernet. Данные приняты, чтобы начаться с заголовка Ethernet. Функция не будет автоматически устанавливать исходный адрес в заголовке Ethernet.<br>
int main (int argc, char *argv [])<br>
Эта функция вызывает ARP_Init(), UserLoop() и ARP_CleanUp().<br>
void UserLoop (void)<br>
Эта функция содержит интерфейс командной строки. Это также вызовет функцию ARP_SecondProcessing каждую секунду.<br>
char* IPAddrToA (PIPADDR pIPAddr)<br>
Эта функция переводит бинарный IP адрес в строку. Функция использует внутренние буфера, которые будут разрушены каждым запросом.<br>
char* ENetAddrToA (PENETADDR pENetAddr)<br>
Эта функция переводит бинарный аппаратный адрес к строке. Функция использует внутренние буфера, которые будут разрушены каждым запросом.<br>
WORD htons (WORD wHostOrder)<br>
WORD ntohs (WORD wNetOrder)<br>
Переводит 16-разрядное целое число от ведущего упорядочения байта до сетевого упорядочения байта и наоборот.<br>
DWORD htonl (DWORD dwHostOrder)<br>
DWORD ntohl (DWORD dwNetOrder)<br>
Переводит 32-разрядное целое число от ведущего упорядочения байта до сетевого упорядочения байта и наоборот.<br>
DWORD Time (void)<br>
Возвращает текущее время в секундах с 1-ого января 1970. Эта функция принята, чтобы быть медленным. <br>
НЕ объявленные функции<br>
Следующие функции только объявлены, и должны быть определены в файле ARP.C.<br>
void ARP_SecondProcessing (void)<br>
Функцию вызывает UserLoop() каждую секунду. Вы определяете, как это должно использоваться.<br>
void ARP_ProcessIncoming (PVOID pData, DWORD dwLen)<br>
Эту функцию вызывают, когда прибыл пакет с протоколом типа 0x0806 (ARP). Никакие тесты не были выполнены на входящих данных. ARP_ProcessIncoming(), как ожидается, исполнит все необходимые испытания. pData - указатель на буфер, содержащий необработанные данные Ethernet.<br>
void ARP_Init (void)<br>
Эту функцию вызывают, при запуске программы, и может, например, содержать код для распределения памяти.<br>
void ARP_Cleanup (void)<br>
Эта функция должна освободить всю распределенную память и исполнить все другие задачи, требуемые для программы закончиться и/или перезапущенный правильным способом.<br>
PENETADDR ARP_Query (PIPADDR pIPAddr)<br>
Эта функция должна искать кэш протокола определения адресов, чтобы узнать аппаратный адрес для данного адреса IP. Если кэш не содержит информацию относительно адреса, функция должна послать запрос на сети и возвращении (PENETADDR) 0. При решении для данных сбоев адреса IP (который является; если целевой хост не существует или недоступен), функция должна возвратиться (PENETADDR)-1.<br>
void ARP_PrintAll (void)<br>
Эта функция должна вывести все входы в кэше протокола определения адресов на пульт (экран). Поля, чтобы вывести: Состояние, адрес IP, Ethernet обращается и Целая жизнь мгновенно. Поле состояния должно указать, содержит ли вход допустимую трансляцию или если решение терпело неудачу. Это может также содержать другие значения состояния, необходимые для Вас решить это испытание. Значение Life Time должно указать, сколько секунд вход правилен{допустим}, это никогда не может превышать 30 или быть ниже 0. <br>
Отклонения от реального мира<br>
•	Пожалуйста обратите внимание, что не возможно послать целенаправленные запросы протокола определения адресов: посылка запросов радиопередачи будет работать, но посылка их к определенному адресу МАКИНТОША не будет работать.<br>
•	Аппаратный адрес отправителя в заголовках Ethernet датаграмм, которые Вы получаете, будет всегда быть полностью случайным аппаратным адресом; Вы никогда не будете вероятно видеть тот же самый адрес, используемый дважды.<br>
<br>
</div></div><br>
<br>
Также есть следующий листинг программы:<br>
<br>
<strong class='tag-b'>ARP.CPP</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &quot;typedefs.h&quot;</div><div class="code_line">#include &quot;utils.h&quot;</div><div class="code_line">#include &quot;arp.h&quot;</div><div class="code_line">/************************************************************************</div><div class="code_line">* This is where you write your ARP implementation.</div><div class="code_line">************************************************************************/</div><div class="code_line">void ARP_ProcessIncoming(PVOID pData, DWORD dwLen)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP_ProcessIncoming not done.\r\n&quot;);</div><div class="code_line">}</div><div class="code_line">void ARP_Init(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP_Init not done.\r\n&quot;);</div><div class="code_line">}</div><div class="code_line">void ARP_Cleanup(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP_Cleanup not done.\r\n&quot;);</div><div class="code_line">}</div><div class="code_line">void ARP_SecondProcessing(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* Whatever... */</div><div class="code_line">}</div><div class="code_line">void ARP_PrintAll(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP_PrintAll not done.\r\n&quot;);</div><div class="code_line">}</div><div class="code_line">PENETADDR ARP_Query(PIPADDR pIPAddr)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP_Query not done.\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;return (PENETADDR)0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<strong class='tag-b'>ARP.H</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef __ARP_H__</div><div class="code_line">#define __ARP_H__</div><div class="code_line">/************************************************************************</div><div class="code_line">&nbsp;* Here, you may add definitions needed for your implementation.</div><div class="code_line">&nbsp;************************************************************************/</div><div class="code_line">void ARP_Init(void);</div><div class="code_line">void ARP_Cleanup(void);</div><div class="code_line">void ARP_SecondProcessing(void);</div><div class="code_line">void ARP_PrintAll(void);</div><div class="code_line">PENETADDR ARP_Query(PIPADDR pIPAddr);</div><div class="code_line">void ARP_ProcessIncoming(PVOID pData, DWORD dwLen);</div><div class="code_line">#endif /* __ARP_H__ */</div></ol></div></div></div></div><br>
<strong class='tag-b'>SECRET.C</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;memory.h&#62;</div><div class="code_line">#include &#60;time.h&#62;</div><div class="code_line">#include &quot;typedefs.h&quot;</div><div class="code_line">#include &quot;utils.h&quot;</div><div class="code_line">#include &quot;arp.h&quot;</div><div class="code_line">/************************************************************************</div><div class="code_line">* DO NOT READ THE CONTENTS OF THIS FILE!!!!!</div><div class="code_line">************************************************************************/</div><div class="code_line">#define C6(od,s) Cn(od,s,6)</div><div class="code_line">#define C4(od,s) Cn(od,s,4)</div><div class="code_line">#define Cn(od,s,n) memcpy(chBuf+od,s,n)</div><div class="code_line">#define S6(od, ch) memset(chBuf+od, ch, 6)</div><div class="code_line">#define WP(p) ((WORD*)(p))</div><div class="code_line">#define nWP(p) (*WP(p))</div><div class="code_line">char q[256];</div><div class="code_line">int ql=0;</div><div class="code_line">#ifdef _DEV</div><div class="code_line">#include &quot;dev/dev.inl&quot;</div><div class="code_line">#endif</div><div class="code_line">void Iface_Send(PVOID pData, DWORD dwLen)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* If, after all, you&#39;re reading this. DON&#39;T code this way. </div><div class="code_line">&nbsp;&nbsp; * It just looks this way to make it hard for you to read the code :) */</div><div class="code_line">&nbsp;</div><div class="code_line">void ARP_SimulatReceivedQuery(void);</div><div class="code_line">{ </div><div class="code_line">&nbsp;&nbsp; BYTE *pch=pData;</div><div class="code_line">&nbsp;&nbsp; if(nWP(pch+16)==8 &amp;&amp; dwLen&#62;=42 &amp;&amp; &nbsp;pch[0]==255 &amp;&amp; pch[1]==255 &amp;&amp; pch[19]==4 &amp;&amp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;!memcmp(pch+6, (char*)Iface_GetENetAddress(), 6) &amp;&amp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;nWP(pch+12)==0x0608 &amp;&amp; pch[4]==255 &amp;&amp; pch[5]==255 &amp;&amp; nWP(pch+14)==256 &amp;&amp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pch[18]==6 &amp;&amp; nWP(pch+20)==256 &amp;&amp; (rand()&amp;15)!=0 &amp;&amp; pch[2]==255 &amp;&amp; pch[3]==255 )</div><div class="code_line">&nbsp;&nbsp; { </div><div class="code_line">&nbsp;&nbsp; &nbsp;ql=42; </div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(q, pch, 42); </div><div class="code_line">&nbsp;&nbsp; &nbsp;q[6]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;q[7]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;q[8]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;q[9]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;q[10]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;q[11]=rand();</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(q, pch+6, 6); </div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(q+22, pch+32, 10); </div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(q+32, pch+22, 10); </div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(q+22, q+6, 6); </div><div class="code_line">&nbsp;&nbsp; &nbsp;nWP(q+20)=512; </div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;} </div><div class="code_line">} </div><div class="code_line">&nbsp;</div><div class="code_line">PIPADDR Iface_GetIPAddress(void) </div><div class="code_line">{ </div><div class="code_line">static BYTE c[4]={192,168,11,1}; </div><div class="code_line">return (PIPADDR) c; </div><div class="code_line">} </div><div class="code_line">&nbsp;</div><div class="code_line">PENETADDR Iface_GetENetAddress(void) </div><div class="code_line">{ </div><div class="code_line">static BYTE c[6]={0,32, 0x1a, 0x22, 0x7f, 0x9b}; &nbsp;</div><div class="code_line">return (PENETADDR) c; </div><div class="code_line">} </div><div class="code_line">&nbsp;</div><div class="code_line">void ARP_SimulateReceivedQuery(void) </div><div class="code_line">{ </div><div class="code_line">BYTE chBuf[42]; </div><div class="code_line">int n; </div><div class="code_line">for(n=0;n&#60;42;n++) </div><div class="code_line">chBuf[n]=(BYTE)rand(); </div><div class="code_line">C6(22,chBuf); </div><div class="code_line">S6((n&amp;129),0xff);</div><div class="code_line">S6((n=32), 0); </div><div class="code_line">nWP(chBuf+12)=(193&#60;&#60;3); </div><div class="code_line">n+=6; </div><div class="code_line">C4(n,Iface_GetIPAddress()); </div><div class="code_line">n-=6; </div><div class="code_line">chBuf[-13+n]=4; </div><div class="code_line">chBuf[50-n]=chBuf[(n&#62;&#62;1)+3]+2;</div><div class="code_line">nWP(chBuf+16)=8; </div><div class="code_line">nWP(chBuf+14)=nWP(chBuf+(n&#62;&#62;1)+4)=256; </div><div class="code_line">ARP_ProcessIncoming(chBuf, 42); </div><div class="code_line">} </div><div class="code_line">&nbsp;</div><div class="code_line">void Secret_SecondProcessing(void) </div><div class="code_line">{ </div><div class="code_line">&nbsp;&nbsp;if(ql) </div><div class="code_line">&nbsp;&nbsp;{ </div><div class="code_line">&nbsp;&nbsp; &nbsp; ARP_ProcessIncoming(q, ql); </div><div class="code_line">&nbsp;&nbsp; &nbsp; ql=0; </div><div class="code_line">&nbsp;&nbsp;} </div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'> TYPEDEFS.H </strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef __TYPEDEFS_H__</div><div class="code_line">#define __TYPEDEFS_H__</div><div class="code_line">/*************** Do NOT alter this file!! *****************/</div><div class="code_line">#define TRUE &nbsp;(1)</div><div class="code_line">#define FALSE &nbsp;(0)</div><div class="code_line">&nbsp;</div><div class="code_line">typedef int BOOL;</div><div class="code_line">typedef unsigned char BYTE;</div><div class="code_line">typedef unsigned short int WORD;</div><div class="code_line">typedef unsigned long int DWORD;</div><div class="code_line">typedef void *PVOID;</div><div class="code_line">typedef struct tagIPADDR</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;BYTE v[4];</div><div class="code_line">} IPADDR, *PIPADDR;</div><div class="code_line">typedef struct tagENETADDR</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;BYTE v[6];</div><div class="code_line">} ENETADDR, *PENETADDR;</div><div class="code_line">typedef struct tagENETHDR</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;ENETADDR HwDest;</div><div class="code_line">&nbsp;&nbsp;ENETADDR HwSender;</div><div class="code_line">&nbsp;&nbsp;WORD wProto;</div><div class="code_line">} ENETHDR, *PENETHDR;</div><div class="code_line">#endif /* __TYPEDEFS_H__ */</div></ol></div></div></div></div><br>
<strong class='tag-b'>UTILS.C </strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;memory.h&#62;</div><div class="code_line">#include &#60;time.h&#62;</div><div class="code_line">#include &quot;typedefs.h&quot;</div><div class="code_line">#include &quot;utils.h&quot;</div><div class="code_line">#include &quot;arp.h&quot;</div><div class="code_line">/*************** BELOW MAY NEED TO BE CHANGED FOR YOUR PLATFORM!!!! */</div><div class="code_line">#include &#60;conio.h&#62;</div><div class="code_line">BOOL KBHit(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (BOOL)kbhit();</div><div class="code_line">}</div><div class="code_line">int Getch(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return getch();</div><div class="code_line">}</div><div class="code_line">DWORD Time(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (DWORD)time(NULL);</div><div class="code_line">}</div><div class="code_line">/*************** ABOVE MAY NEED TO BE CHANGED FOR YOUR PLATFORM!!!! */</div><div class="code_line">/* Forward declarations of functions exported from secret.c */</div><div class="code_line">void ARP_SimulateReceivedQuery(void);</div><div class="code_line">void Secret_SecondProcessing(void);</div><div class="code_line">/****************************************************************************</div><div class="code_line">&nbsp;* Function : __ntohs, __ntohl</div><div class="code_line">&nbsp;* Purpose &nbsp;: Change byte order of a short and long int, respectively</div><div class="code_line">&nbsp;* Returns &nbsp;: The byte (and word) swapped result of the original value</div><div class="code_line">&nbsp;***************************************************************************/</div><div class="code_line">WORD __ntohs(WORD w)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (w&#60;&#60;8) | (w&#62;&#62;8);</div><div class="code_line">}</div><div class="code_line">DWORD __ntohl(DWORD dw)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (dw&#60;&#60;24) | (dw&#62;&#62;24) | ( (dw&amp;0x00ff0000) &#62;&#62; 8 ) | ( (dw&amp;0x0000ff00) &#60;&#60; 8);</div><div class="code_line">}</div><div class="code_line">/****************************************************************************</div><div class="code_line">* Function : ENetAddrToA</div><div class="code_line">* Purpose &nbsp;: Translate an ENETADDR value to an ASCIIZ string</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;The result is stored in an internal, static buffer</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;that is overwritten each time this function is called.</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;It is not suitable for multithreading, and cannot</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;be called multiple times in the same parsing context.</div><div class="code_line">* Returns &nbsp;: A char pointer to a static buffer containing the result string</div><div class="code_line">***************************************************************************/</div><div class="code_line">char* ENetAddrToA(PENETADDR p)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;static char szBuf[20];</div><div class="code_line">&nbsp;&nbsp;sprintf(szBuf, &quot;%02x%02x:%02x%02x:%02x%02x&quot;, </div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[1],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[2],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[3],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[4],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[5]</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;&nbsp;return szBuf;</div><div class="code_line">}</div><div class="code_line">/****************************************************************************</div><div class="code_line">* Function : IPAddrToA</div><div class="code_line">* Purpose &nbsp;: Translate an IPADDR value to an ASCIIZ string</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;The result is stored in an internal, static buffer</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;that is overwritten each time this function is called.</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;It is not suitable for multithreading, and cannot</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;be called multiple times in the same parsing context.</div><div class="code_line">* Returns &nbsp;: A char pointer to a static buffer containing the result string</div><div class="code_line">***************************************************************************/</div><div class="code_line">char* IPAddrToA(PIPADDR p)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;static char szBuf[20];</div><div class="code_line">&nbsp;&nbsp;sprintf(szBuf, &quot;%i.%i.%i.%i&quot;, </div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[0],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[1],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[2],</div><div class="code_line">&nbsp;&nbsp; &nbsp;((BYTE*)p)[3]</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;&nbsp;return szBuf;</div><div class="code_line">}</div><div class="code_line">/****************************************************************************</div><div class="code_line">* Function : UserLoop</div><div class="code_line">* Purpose &nbsp;: Prompt the user for input, take appropriate action</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Call the various xxxx_SecondProcessing() functions</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;once per second.</div><div class="code_line">* Returns &nbsp;: -</div><div class="code_line">***************************************************************************/</div><div class="code_line">void UserLoop(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;static int c;</div><div class="code_line">&nbsp;&nbsp;static DWORD dwNow=0;</div><div class="code_line">&nbsp;&nbsp;static IPADDR aIPAddr[10]=</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,5},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,15},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,17},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,19},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,33},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,35},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,47},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,99},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,195},</div><div class="code_line">&nbsp;&nbsp; &nbsp;{192,168,22,222}</div><div class="code_line">&nbsp;&nbsp;};</div><div class="code_line">&nbsp;&nbsp;srand((unsigned int)Time());</div><div class="code_line">&nbsp;&nbsp;printf(&quot;ARP Algorithm Tester\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;Press keys 0--9 to have this computer query the network\r\n&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &quot; &nbsp; for one of ten IP addresses\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;Press R to simulate receiving an ARP query.\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;Press L to list ARP cache contents\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;Press [esc] to exit\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;\r\n&#62;&quot;);</div><div class="code_line">&nbsp;&nbsp;while(TRUE)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(Time()!=dwNow)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int nRand=rand()&1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwNow=Time();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(nRand)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Secret_SecondProcessing();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ARP_SecondProcessing();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(!nRand)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Secret_SecondProcessing();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!KBHit())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;c=Getch();</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(c==27)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;\r &nbsp; \r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if(c&#62;=&#39;0&#39; &amp;&amp; c&#60;=&#39;9&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int n = c-&#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;PENETADDR pENetAddr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;Query for address %s returns : &quot;, IPAddrToA(aIPAddr+n));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pENetAddr = ARP_Query(aIPAddr+n);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(pENetAddr == (PENETADDR) 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Address not resolved yet.\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if(pENetAddr == (PENETADDR) -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Address could not be resolved.\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s\r\n&quot;, ENetAddrToA(pENetAddr));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if(c==&#39;r&#39; || c==&#39;R&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ARP_SimulateReceivedQuery();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if(c==&#39;l&#39; || c==&#39;L&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;Contents of the ARP cache:\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ARP_PrintAll();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;\r\n&#62;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">/****************************************************************************</div><div class="code_line">* Function : main</div><div class="code_line">* Purpose &nbsp;: Call ARP_Init, UserLoop and then ARP_Cleanup</div><div class="code_line">* Returns &nbsp;: 0</div><div class="code_line">***************************************************************************/</div><div class="code_line">&nbsp;</div><div class="code_line">int main(int argc, char *argv[])</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;ARP_Init();</div><div class="code_line">&nbsp;&nbsp;UserLoop();</div><div class="code_line">&nbsp;&nbsp;ARP_Cleanup();</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'> UTILS.H </strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef __UTILS_H__</div><div class="code_line">#define __UTILS_H__</div><div class="code_line">/*************** Do NOT alter this file!! *****************/</div><div class="code_line">DWORD Time(void);</div><div class="code_line">char* IPAddrToA(PIPADDR pIPAddr);</div><div class="code_line">char* ENetAddrToA(PENETADDR pENetAddr);</div><div class="code_line">PIPADDR Iface_GetIPAddress(void);</div><div class="code_line">PENETADDR Iface_GetENetAddress(void);</div><div class="code_line">void Iface_Send(PVOID pData, DWORD dwLen);</div><div class="code_line">WORD __ntohs(WORD w);</div><div class="code_line">DWORD __ntohl(DWORD dw);</div><div class="code_line">#if 1</div><div class="code_line">&nbsp;&nbsp;/* Use 1 if host byte ordering is different from network byte ordering</div><div class="code_line">&nbsp;&nbsp; * Otherwise use 0</div><div class="code_line">&nbsp;&nbsp; * &quot;1&quot; is necessary for Intel CPU&#39;s, for instance. &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;#define htons(x) __ntohs(x)</div><div class="code_line">&nbsp;&nbsp;#define ntohs(x) __ntohs(x)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#define htonl(x) __ntohl(x)</div><div class="code_line">&nbsp;&nbsp;#define ntohl(x) __ntohl(x)</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp; &nbsp;#define htons(x) (x)</div><div class="code_line">&nbsp;&nbsp;#define ntohs(x) (x)</div><div class="code_line">&nbsp;&nbsp; &nbsp;#define htonl(x) (x)</div><div class="code_line">&nbsp;&nbsp;#define ntohl(x) (x)</div><div class="code_line">#endif</div><div class="code_line">BOOL KBHit(void); </div><div class="code_line">int Getch(void);</div><div class="code_line">#endif /* __UTILS_H__ */</div></ol></div></div></div></div><br>
<br>
Если я правильно понял в файле ARP.C нужно заполнить следующие методы для организации работы ARP:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void ARP_ProcessIncoming(PVOID pData, DWORD dwLen)</div><div class="code_line">void ARP_Init(void)</div><div class="code_line">void ARP_Cleanup(void)</div><div class="code_line">void ARP_SecondProcessing(void)</div><div class="code_line">void ARP_PrintAll(void)</div><div class="code_line">PENETADDR ARP_Query(PIPADDR pIPAddr)</div></ol></div></div></div></div><br>
<br>
С сетями иметь дело не доводилось, а из прочтенных RFC 826 и RFC 971 я ничего не поял. <br>
<br>
Подскажите пожалуйста как можно выполнить это задание и если е трудно предоставить пример на ANSII C, без использоваия С++ и встроенного ассемблерного кода.<br>
<br>
Буду примного благодарен.<br>
<br>
Если есть какие ссылки на источники то укажите пожалуйста.<br>
<br>
Спасибо.]]></description>
        <author>bizisoft</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	