Jak zjistit sitova rozhrani
Pavel Janík
Pavel na Janik.cz
Úterý Září 4 19:18:21 CEST 2001
From: Pavel Kankovsky <peak na argo.troja.mff.cuni.cz>
Date: Tue, 4 Sep 2001 14:05:30 +0200 (MET DST)
Ahoj,
> Kdyz pomineme analyzu veci v /proc, jak uz tady bylo doporucovano, tak se
> to dela takovym vtipnym zpusobem, ze vyrobite socket (nevim, jestli zalezi
> na PF_) a pak na nej delate ruzne ioctl() zacinajici na SIOCG, specialne
> seznam interfejsu by mel byt SIOCGIFCONF. Zpusob predevani parametru je
> ale dost sileny.
Na socket domain nezáleží. Přepsáno do C to následuje (vybrat pouze
eth. rozhraní je domácí úkol ;-). Doufám, že od autora původního dotazu
dostanu tučňáka nebo si to budu moct někdy vybrat :-)
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
int main(int argc, char *argv[])
{
int sd, n;
struct ifconf ifc;
struct ifreq *ifr;
sd=socket(AF_INET, SOCK_STREAM, 0);
ifc.ifc_buf = NULL;
ifc.ifc_len = sizeof(struct ifreq) * 10;
ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);
if (ioctl(sd, SIOCGIFCONF, &ifc) < 0)
perror("SIOCGIFCONF");
ifr = ifc.ifc_req;
for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) {
fprintf(stdout, "%s\n", ifr->ifr_ifrn.ifrn_name);
ifr++;
}
free(ifc.ifc_buf);
exit(0);
}
--
Pavel Janík
It's entirely untested, but it looks good and compiles. Ship it!
-- Linus Torvalds in linux-kernel
Další informace o konferenci Linux