Добрый день!
Столкнулся с аномалией. В нижеприведенном коде пытаюсь получить МАС из arp таблицы. Для воспроизведения надо поставить в строке 50
cout << resolve_mac("192.168.1.1") << endl;
адрес устройства, видимого в вашей локальной сети и чтобы он был виден в вашей arp таблице (arp -n).
компилирую без ошибок и варнингов
$ g++ bug.cpp --std=c++0x -Wall -Wextra
пустой вывод, видимо возвращается NULL
$ ./a.out
$
Раскомментируем простой cout в строке 36
cout << "> " << ip << endl;
и код работает как надо, тоесть функция возвращает МАС как и задумывалось.
$ ./a.out
> 192.168.1.1
00:01:02:03:04:05
Я создал багрепорт
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57937, там мне ответили что дело в возвращении адреса локальной переменной.
Но! Я не могу понять,
как влияет простой cout на возвращение или не возвращение адреса локальной переменной ? При чем тут вообще cout?
#include <iostream>
#include <arpa/inet.h>
#include <string.h>
using namespace std;
#define PROCFS_ARP "/proc/net/arp"
const char * resolve_mac(const char *ip_to_resolve)
{
uint32_t ipaddr = inet_addr(ip_to_resolve);
if (ipaddr == INADDR_NONE)
return NULL;
char ip[100];
char hwa[100];
char mask[100];
char line[100];
char dev[100];
int flags, num, type;
FILE *fp;
fp = fopen(PROCFS_ARP, "r");
if (fp == NULL)
return NULL;
memset(&hwa, 0, sizeof(hwa));
if (fgets(line, sizeof(line), fp) != (char *)NULL) {
for (; fgets(line, sizeof(line), fp); ) {
num = sscanf(line, "%s 0x%x 0x%x %100s %100s %100s\n", ip, &type, &flags, hwa, mask, dev);
if (num < 4)
break;
//cout << "> " << ip << endl;
if (inet_addr(ip) == ipaddr) {
const char *m = hwa;
return m;
}
}
}
return NULL;
}
int main()
{
cout << resolve_mac("192.168.1.1") << endl;
return 0;
}
Ubuntu 12.10 с последними обновлениями.
$ g++ -v
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)
$ uname -a
Linux notebook 3.5.0-36-generic #57-Ubuntu SMP Wed Jun 19 15:10:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux