<?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=380765&amp;view=findpost&amp;p=3348399</guid>
        <pubDate>Wed, 21 Aug 2013 20:41:21 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348399</link>
        <description><![CDATA[pesekot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=380765&view=findpost&p=3348386'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2013-08-21T23:29:44+04:00">21.08.13, 19:29</time></span><div class='quote '>Похоже, очередной раз идейный код был тупо использован в качестве готового решения. А подумать?<br>
Я ж говорил, что WinAPI тут для примера. Просто демонстрация дизайна кода, как обычно дружатся объекты с простым структурным API. Что касается остального... построчно:<ol class="tag-list" type="1"><li>...</li><li>...</li><li>Это понятно. Многие реализации offsetof этим грешат. Хотя формально написать его так, чтобы не привлекать NULL-поинтеры, не проблема, авторы многих &lt;cstddef&gt; ленятся...</li><li>...Исправить это можно, написав собственный его аналог. Это несложно.</li><li>Это понятно. #include &lt;stdexcept&gt;. Кроме того, это ж просто обработка ошибки, которой быть не должно, ибо это означает крупную лажу в коде. Исключения в таких случаях вполне уместны, однако у тебя может быть другое мнение, обрабатывай на своё усмотрение.</li><li>Ну не зря же у меня struct. Во-первых, тесно связанная с LocalMacAdd свободная функция вполне может быть и другом, ...</li><li>...во-вторых, статические методы я тоже упоминал.</li><li>...</li><li>Не вижу причины. Вероятно следовало уточнить &amp;this-&gt;search_ip.</li></ol></div></div><br>
Друг, подумать всегда полезно но мне нужно завтра уже сдавать :)]]></description>
        <author>pesekot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348386</guid>
        <pubDate>Wed, 21 Aug 2013 19:29:44 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348386</link>
        <description><![CDATA[Qraizer: Похоже, очередной раз идейный код был тупо использован в качестве готового решения. А подумать?<br>
Я ж говорил, что WinAPI тут для примера. Просто демонстрация дизайна кода, как обычно дружатся объекты с простым структурным API. Что касается остального... построчно:<ol class="tag-list" type="1"><li>...</li><li>...</li><li>Это понятно. Многие реализации offsetof этим грешат. Хотя формально написать его так, чтобы не привлекать NULL-поинтеры, не проблема, авторы многих &lt;cstddef&gt; ленятся...</li><li>...Исправить это можно, написав собственный его аналог. Это несложно.</li><li>Это понятно. #include &lt;stdexcept&gt;. Кроме того, это ж просто обработка ошибки, которой быть не должно, ибо это означает крупную лажу в коде. Исключения в таких случаях вполне уместны, однако у тебя может быть другое мнение, обрабатывай на своё усмотрение.</li><li>Ну не зря же у меня struct. Во-первых, тесно связанная с LocalMacAdd свободная функция вполне может быть и другом, ...</li><li>...во-вторых, статические методы я тоже упоминал.</li><li>...</li><li>Не вижу причины. Вероятно следовало уточнить &amp;this-&gt;search_ip.</li></ol>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348364</guid>
        <pubDate>Wed, 21 Aug 2013 18:20:54 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348364</link>
        <description><![CDATA[pesekot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=380765&view=findpost&p=3348353'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2013-08-21T17:23:16+00:00">21.08.13, 17:23</time></span><div class='quote '>Что-то я смутно представляю, как это тебе поможет. Давай я набросаю идею, а ты посмотри, что из этого будет полезным.<br>
Обычно в случаях, когда легаси-коду требуется передать метода класса, коллбэком делают всё-таки свободную функцию. Или статический метод, их сигнатуры от this не зависят и в общем-то совместимы со свободными функциями. При этом this как-то куда-то передают на сохранение, чтобы в этой свободной функции его достать и использовать по назначению - вызвать с ним требуемый его метод. Способов много. Например, в WinAPI у подавляющего большинства коллбэков в параметрах обязательно предусмотрен некий void*, каковой самим WinAPI не используется и просто передаётся из точки API-вызова в коллбэк. Например (для большей ясности определения чуть изменены):<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">BOOL EnumWindows(WNDENUMPROC lpEnumFunc, <span style='color:red'>LPARAM lParam</span>);</div><div class="code_line">typedef BOOL (*WNDENUMPROC)(HWND hwnd, <span style='color:red'>LPARAM lParam</span>);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Этот самый lParam и является тем самым пользовательским данным. В него можно запихать, что душе угодно, им может быть указатель на структурку с передаваемыми в коллбэк параметрами и в частности this. Я предлагаю тебе использовать что-то вроде этого. Беда в том, что в pcap_handler нет пользовательских параметров, как я погляжу. Но ничего, его можно замешать в имеющиеся. Правда, все эти касты... будь они неладны. Вот наколеночное, я его не тестил, хоть и относительно, но-таки более-менее безопасное, решение. Используется RTTI для контроля в run-time:<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">struct in_addr_proxy</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct in_addr* search_ip;</div><div class="code_line">&nbsp;&nbsp;LocalMacAdd* &nbsp; &nbsp;it_is_this;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in_addr_proxy(struct in_addr* ip, LocalMacAdd* obj): search_ip(ip), it_is_this(obj) {}</div><div class="code_line">&nbsp;&nbsp;operator in_addr* &nbsp; &nbsp; () const &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { return search_ip; }</div><div class="code_line">&nbsp;&nbsp;virtual ~in_addr_proxy() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">void find_eth_addr_proxy(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;in_addr_proxy *restored = (in_addr_proxy *)((char*)search_ip - offsetof(in_addr_proxy, search_ip));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (typeid(*restored) != typeid(in_addr_proxy)) throw std::invalid_argument(&quot;find_eth_addr_proxy(): 1st param hasn&#39;t the in_addr_proxy type&quot;);</div><div class="code_line">&nbsp;&nbsp;restored-&#62;it_is_this-&#62;find_eth_addr(restored-&#62;search_ip, pkthdr, packet);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">pcap_loop(descr, -1, find_eth_addr_proxy, (u_char*)(in_addr*)&amp;(in_addr_proxy(&amp;search_ip, this)));</div></ol></div></div></div></div><br>
<br>
P.S. Могут присутствовать даже опечатки.</div></div><br>
Спасибо за ответ, но я уже просто напросто для этого решения исключил класс, WinAPI не подойдет так как платформа Ubuntu 10.04. Запустил твое решение, просто без дебага выдало следующие ошибки, возможно наследникам пригодится :)<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">root@ubuntu:/home/administrator/Desktop/projectM# g++ -o main main.cpp basic_info.cpp local_mac.cpp -lpcap</div><div class="code_line">local_mac.cpp: In function ‘void find_eth_addr_proxy(in_addr*, const pcap_pkthdr*, const u_char*)’:</div><div class="code_line">local_mac.cpp:38: warning: invalid access to non-static data member ‘in_addr_proxy::search_ip’ &nbsp;of NULL object</div><div class="code_line">local_mac.cpp:38: warning: (perhaps the ‘offsetof’ macro was used incorrectly)</div><div class="code_line">local_mac.cpp:40: error: ‘invalid_argument’ was not declared in this scope</div><div class="code_line">local_mac.cpp:15: error: ‘void LocalMacAdd::find_eth_addr(in_addr*, const pcap_pkthdr*, const u_char*)’ is private</div><div class="code_line">local_mac.cpp:41: error: within this context</div><div class="code_line">local_mac.cpp: In member function ‘int LocalMacAdd::GetAddres()’:</div><div class="code_line">local_mac.cpp:87: error: invalid use of member (did &nbsp;you forget the ‘&amp;’ )</div></ol></div></div></div></div><br>
Спасибо за быстрый ответ :good:]]></description>
        <author>pesekot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348353</guid>
        <pubDate>Wed, 21 Aug 2013 17:23:16 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348353</link>
        <description><![CDATA[Qraizer: Что-то я смутно представляю, как это тебе поможет. Давай я набросаю идею, а ты посмотри, что из этого будет полезным.<br>
Обычно в случаях, когда легаси-коду требуется передать метода класса, коллбэком делают всё-таки свободную функцию. Или статический метод, их сигнатуры от this не зависят и в общем-то совместимы со свободными функциями. При этом this как-то куда-то передают на сохранение, чтобы в этой свободной функции его достать и использовать по назначению - вызвать с ним требуемый его метод. Способов много. Например, в WinAPI у подавляющего большинства коллбэков в параметрах обязательно предусмотрен некий void*, каковой самим WinAPI не используется и просто передаётся из точки API-вызова в коллбэк. Например (для большей ясности определения чуть изменены):<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">BOOL EnumWindows(WNDENUMPROC lpEnumFunc, <span style='color:red'>LPARAM lParam</span>);</div><div class="code_line">typedef BOOL (*WNDENUMPROC)(HWND hwnd, <span style='color:red'>LPARAM lParam</span>);</div></ol></div></div></div></div>Этот самый lParam и является тем самым пользовательским данным. В него можно запихать, что душе угодно, им может быть указатель на структурку с передаваемыми в коллбэк параметрами и в частности this. Я предлагаю тебе использовать что-то вроде этого. Беда в том, что в pcap_handler нет пользовательских параметров, как я погляжу. Но ничего, его можно замешать в имеющиеся. Правда, все эти касты... будь они неладны. Вот наколеночное, я его не тестил, хоть и относительно, но-таки более-менее безопасное, решение. Используется RTTI для контроля в run-time:<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">struct in_addr_proxy</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct in_addr* search_ip;</div><div class="code_line">&nbsp;&nbsp;LocalMacAdd* &nbsp; &nbsp;it_is_this;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in_addr_proxy(struct in_addr* ip, LocalMacAdd* obj): search_ip(ip), it_is_this(obj) {}</div><div class="code_line">&nbsp;&nbsp;operator in_addr* &nbsp; &nbsp; () const &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { return search_ip; }</div><div class="code_line">&nbsp;&nbsp;virtual ~in_addr_proxy() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">void find_eth_addr_proxy(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;in_addr_proxy *restored = (in_addr_proxy *)((char*)search_ip - offsetof(in_addr_proxy, search_ip));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (typeid(*restored) != typeid(in_addr_proxy)) throw std::invalid_argument(&quot;find_eth_addr_proxy(): 1st param hasn&#39;t the in_addr_proxy type&quot;);</div><div class="code_line">&nbsp;&nbsp;restored-&#62;it_is_this-&#62;find_eth_addr(restored-&#62;search_ip, pkthdr, packet);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">pcap_loop(descr, -1, find_eth_addr_proxy, (u_char*)(in_addr*)&amp;(in_addr_proxy(&amp;search_ip, this)));</div></ol></div></div></div></div><br>
<br>
P.S. Могут присутствовать даже опечатки.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348332</guid>
        <pubDate>Wed, 21 Aug 2013 14:54:08 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348332</link>
        <description><![CDATA[pesekot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=380765&view=findpost&p=3348327'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2013-08-21T14:34:37+00:00">21.08.13, 14:34</time></span><div class='quote '></div></div><br>
А если функцию GetAddres () объявить вне класса, и в ней инициализировать объект класса LocalMacAdd?]]></description>
        <author>pesekot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348327</guid>
        <pubDate>Wed, 21 Aug 2013 14:34:37 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348327</link>
        <description><![CDATA[Qraizer: LocalMacAdd::find_eth_addr() - это не свободная функция, это метод класса, и поэтому да, указатели на них должны браться явно. Но не это главное. Взяв указатель на него, ты получишь не тип pcap_handler. Сравни:<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">typedef void ( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *func_ptr &nbsp;)(struct in_addr *, const struct pcap_pkthdr*, const u_char *);</div><div class="code_line">typedef void (LocalMacAdd::*member_ptr)(struct in_addr *, const struct pcap_pkthdr*, const u_char *);</div></ol></div></div></div></div>Более того, эти типы неприводимы друг к другу. Даже явный каст типа даст ошибку. И это правильно, методу нужен this, а C-коду, использующему тип pcap_handler, неоткуда его взять, он вообще не курсе, что что-то ещё нужно. Если компилятор такое пропустит, код обязательно свалится, ибо this будет мусором.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348323</guid>
        <pubDate>Wed, 21 Aug 2013 13:57:08 +0000</pubDate>
        <title>Ошибка компиляции</title>
        <link>https://forum.sources.ru/index.php?showtopic=380765&amp;view=findpost&amp;p=3348323</link>
        <description><![CDATA[pesekot: Народ помогите. Пишу программу, которая должна определить все МАК и IP адрес, что-то на подобии tcpdump. Платформа Ubuntu 10.04.<br>
Есть программный код, который определяет МАК адреса. Решил его переделать его из С в С + +, соответственно с классом и H файлом<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;pcap.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;signal.h&#62;</div><div class="code_line">#include &#60;netinet/ip.h&#62;</div><div class="code_line">#include &#60;netinet/if_ether.h&#62;</div><div class="code_line">#include &#60;arpa/inet.h&#62;</div><div class="code_line">#include &#60;netinet/ether.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">int child_pid = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">void print_eth_addr(void *addr) {</div><div class="code_line">&nbsp;&nbsp;printf(&quot;%s\n&quot;, ether_ntoa((struct ether_addr *)addr));</div><div class="code_line">&nbsp;&nbsp;kill(child_pid, 9);</div><div class="code_line">&nbsp;&nbsp;exit(0);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void find_eth_addr(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet) {</div><div class="code_line">&nbsp;&nbsp;struct ether_header *eth_hdr = (struct ether_header *)packet;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (ntohs(eth_hdr-&#62;ether_type) == ETHERTYPE_IP) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct ip *ip_hdr = (struct ip *)(packet + sizeof(struct ether_header));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ip_hdr-&#62;ip_dst.s_addr == search_ip-&#62;s_addr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;print_eth_addr(eth_hdr-&#62;ether_dhost);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ip_hdr-&#62;ip_src.s_addr == search_ip-&#62;s_addr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;print_eth_addr(eth_hdr-&#62;ether_shost);</div><div class="code_line">&nbsp;&nbsp;}</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;char *dev, errbuf[PCAP_ERRBUF_SIZE];</div><div class="code_line">&nbsp;&nbsp;pcap_t* descr;</div><div class="code_line">&nbsp;&nbsp;bpf_u_int32 maskp, netp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (argc &#60; 2) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;Usage: %s &#60;ip&#62; [interface]\n&quot;, argv[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (argc == 2 &amp;&amp; !(dev = pcap_lookupdev(errbuf))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;%s\n&quot;, errbuf); return 1;</div><div class="code_line">&nbsp;&nbsp;} else if (argc == 3) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;dev = argv[2];</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;pcap_lookupnet(dev,&amp;netp,&amp;maskp,errbuf);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (!(descr = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;pcap_open_live(): %s\n&quot;, errbuf); return 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;struct in_addr search_ip;</div><div class="code_line">&nbsp;&nbsp;if (!inet_aton(argv[1], &amp;search_ip)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fprintf(stderr, &quot;bad ip\n&quot;); exit(1);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;int pid = fork();</div><div class="code_line">&nbsp;&nbsp;if (pid == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;struct sockaddr_in sin;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sin.sin_family = PF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inet_aton(argv[1], &amp;sin.sin_addr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sin.sin_port = htons(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int s = socket(PF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;connect(s, (struct sockaddr *)&amp;sin, sizeof(sin));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;usleep(100000);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp;child_pid = pid;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//pcap_loop(descr, -1, (pcap_handler)find_eth_addr, (void *)&amp;search_ip);</div><div class="code_line">pcap_loop(descr, -1, (pcap_handler)find_eth_addr, (u_char *)&amp;search_ip);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Код рабочий, дальше идет моя интерпретация. Соответственно h и cpp.<br>
<strong class='tag-b'>local_mac.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">#pragma once</div><div class="code_line">#ifndef BASIC_H</div><div class="code_line">#define BASIC_H</div><div class="code_line">#include &#60;pcap.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;signal.h&#62;</div><div class="code_line">#include &#60;netinet/ip.h&#62;</div><div class="code_line">#include &#60;netinet/if_ether.h&#62;</div><div class="code_line">#include &#60;arpa/inet.h&#62;</div><div class="code_line">#include &#60;netinet/ether.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">&nbsp;int child_pid = 0;</div><div class="code_line">class LocalMacAdd</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;LocalMacAdd(int ARGC, char **ARGV);</div><div class="code_line">&nbsp;&nbsp; &nbsp;int GetAddres();</div><div class="code_line">&nbsp;&nbsp; &nbsp;private:</div><div class="code_line">&nbsp;&nbsp; void print_eth_addr(void *addr);</div><div class="code_line">&nbsp;&nbsp; void find_eth_addr(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet);</div><div class="code_line">&nbsp;char *dev, *ErrorBuffer,**argv;</div><div class="code_line">&nbsp;struct in_addr search_ip;</div><div class="code_line">&nbsp;&nbsp;pcap_t* descr;</div><div class="code_line">&nbsp;&nbsp;bpf_u_int32 maskp, netp;</div><div class="code_line">&nbsp;&nbsp;int argc;</div><div class="code_line">&nbsp;</div><div class="code_line">};</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
<strong class='tag-b'>local_mac.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 &quot;local_mac.h&quot;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">using namespace std;</div><div class="code_line">LocalMacAdd::LocalMacAdd(int &nbsp;ARGC, char **ARGV)</div><div class="code_line">{</div><div class="code_line">argc = ARGC;</div><div class="code_line">argv = ARGV;</div><div class="code_line">}</div><div class="code_line">void LocalMacAdd::print_eth_addr(void *addr)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; &quot; &nbsp;&quot; &#60;&#60; ether_ntoa((struct ether_addr *)addr) &#60;&#60; &quot; &quot; &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp;kill(child_pid, 9);</div><div class="code_line">&nbsp;&nbsp;exit(0);</div><div class="code_line">}</div><div class="code_line">void LocalMacAdd::find_eth_addr(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet)</div><div class="code_line">{</div><div class="code_line">struct ether_header *eth_hdr = (struct ether_header *)packet;</div><div class="code_line">&nbsp;&nbsp;if (ntohs(eth_hdr-&#62;ether_type) == ETHERTYPE_IP) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct ip *ip_hdr = (struct ip *)(packet + sizeof(struct ether_header));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ip_hdr-&#62;ip_dst.s_addr == search_ip-&#62;s_addr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;print_eth_addr(eth_hdr-&#62;ether_dhost);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ip_hdr-&#62;ip_src.s_addr == search_ip-&#62;s_addr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;print_eth_addr(eth_hdr-&#62;ether_shost);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">int LocalMacAdd::GetAddres()//int argc, char **argv)</div><div class="code_line">{</div><div class="code_line">ErrorBuffer = new char[PCAP_ERRBUF_SIZE];</div><div class="code_line">if (argc &#60; 2) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; &quot; Usage: &#60;ip&#62; [interface]\n&quot; &#60;&#60; argv[0] &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">if (argc == 2 &amp;&amp; !(dev = pcap_lookupdev(ErrorBuffer))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cerr &#60;&#60; &quot; &nbsp;&quot; &#60;&#60; ErrorBuffer &#60;&#60; &quot; &nbsp;&quot; &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp;} else if (argc == 3) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;dev = argv[2];</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">pcap_lookupnet(dev,&amp;netp,&amp;maskp,ErrorBuffer);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if (!(descr = pcap_open_live(dev, BUFSIZ, 1, -1, ErrorBuffer))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; cout &#60;&#60; &quot;pcap_open_live(): \n &quot; &#60;&#60; ErrorBuffer &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; return 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//struct in_addr search_ip;</div><div class="code_line">&nbsp;&nbsp;if (!inet_aton(argv[1], &amp;search_ip)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cerr &#60;&#60; &quot;bad ip\n&quot; &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit(1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">int pid = fork();</div><div class="code_line">&nbsp;&nbsp;if (pid == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;struct sockaddr_in sin;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sin.sin_family = PF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inet_aton(argv[1], &amp;sin.sin_addr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sin.sin_port = htons(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int s = socket(PF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;connect(s, (struct sockaddr *)&amp;sin, sizeof(sin));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;usleep(100000);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp;child_pid = pid;</div><div class="code_line">&nbsp;&nbsp; // u_char * temp =(u_char *) search_ip;</div><div class="code_line">pcap_loop(descr, -1, (pcap_handler)find_eth_addr,((u_char *) (&amp;search_ip)) );</div><div class="code_line">//pcap_loop(descr, -1, (pcap_handler)find_eth_addr,(u_char *)&amp;search_ip);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
Сама ошибка находится в строке<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">pcap_loop(descr, -1, (pcap_handler)find_eth_addr,((u_char *) (&amp;search_ip)) );</div></ol></div></div></div></div><br>
<strong class='tag-b'>local_mac.cpp:69: error: invalid use of member (did you forget the ‘&amp;’?) </strong><br>
сигнатура функции<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">int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)</div></ol></div></div></div></div><br>
Возможно кто-то чем-то поможет :rolleyes:]]></description>
        <author>pesekot</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	