LINUX.ORG.RU

разобрать на запчасти ifconfig как это сделал например я:

void getip(const std::string interface, std::string& ip)
{
ip = "Unknown IP";
char buf[128];

struct ifreq ifr;
int sock;

sock = socket (AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
throw std::runtime_error("can't open socket");
}

strcpy(ifr.ifr_name, interface.c_str());
if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0)
{
throw std::runtime_error("can't get net flags");
}

if ((ifr.ifr_ifru.ifru_flags & IFF_UP) == 0)
{
throw std::runtime_error("interface is down");
}

strcpy(ifr.ifr_name, interface.c_str());
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl(sock, SIOCGIFADDR, &ifr) != 0)
{
throw std::runtime_error("can't get intarface ip");
}

struct sockaddr *sap = &ifr.ifr_ifru.ifru_addr;
if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
{
throw std::runtime_error("not valid interface flags");
}

struct sockaddr_in *sin = (struct sockaddr_in *) sap;
if (sin->sin_family != AF_INET)
{
throw std::runtime_error("not valid interface flags");
}

unsigned long addr;
addr = (unsigned long) sin->sin_addr.s_addr;

sprintf (buf, "%lu.%lu.%lu.%lu", (addr & 0xFF),
((addr >> 8) & 0xFF), ((addr >> 16) & 0xFF), ((addr >> 24) & 0xFF));

ip = buf;

close (sock);
}

anonymous
()

char *ifname2addr(const char *ifname, char *buf, int size)
  {
  FILE *fp;
  setenv("if", ifname, 1);
  fp = popen("/usr/sbin/ifconfig $if | grep addr | cut -d : -f 2 | cut -d ' ' -f 1", "r");
  if (!fp)  return NULL;
  fgets(buf, size, fp);
  return buf;            /* buf содержит адрес, например "127.0.0.1\n" */
  }

nobody ★★
()
Ответ на: комментарий от nobody

>popen("/usr/sbin/ifconfig...
Вот это Unix-way, уважаю. Не то что товарищ предложил.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.