>Здравствуйте.
>
>Возникла задача получить список доступных интерфейсов в системе (linux. ядро 2.4.20). Вот
>кусочек кода:
>
>int sd;
>struct ifconf ifc;
>
>if ( (sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
> perror("socket() error!");
> exit(1);
>}
>
>memset(&ifc, 0, sizeof ifc);
>
>ioctl(sd, SIOCGIFCONF, &ifc);
>
>close(sd);
>...
>
>Структура ifconf содержит указатель на массив структур ifreq, которая в свою очередь
>содержит поле ifr_name (то есть имя интерфейса).
>Но отлаживая в GDB вижу что указатель на ifreq NULL, в результате
>ничего не получаю.
>
>В чем проблема?
>Спасибо.
Короче делал я в свое время демку, которая вытаскивает всю инфу по интерфейсам, она точно пашет, смотри, юзай.
#undef KERNEL
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/route.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM_IFREQ (512)
extern int errno;
int
main(argc, argv)
int argc; char **argv;
{
struct ifconf Ifc;
struct ifreq IfcBuf[MAX_NUM_IFREQ];
struct ifreq *pIfr;
int num_ifreq;
int i;
int fd;
struct sockaddr_in addrtmp;
unsigned char mac[10]={0};
Ifc.ifc_len = sizeof(IfcBuf);
Ifc.ifc_buf = (char *) IfcBuf;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("\nshowme::socket(): ");
fflush(stderr);
return 0;
}
if ( ioctl(fd, SIOCGIFCONF, &Ifc) < 0) {
perror("\nshowme::ioctl SIOCGIFCONF: ");
fflush(stderr);
close(fd);
return 0;
}
num_ifreq = Ifc.ifc_len / sizeof(struct ifreq);
for ( pIfr = Ifc.ifc_req, i = 0 ; i < num_ifreq; pIfr++, i++ ) {
printf("---===<<<[%d]>>>===---\n", i);
if (pIfr->ifr_addr.sa_family != AF_INET)
printf("\n[%d] Is not AF_INET interface! Next information may be incorrect...\n", i);
printf("\n[%d] Name = %s\n", i, pIfr->ifr_name);
if ( ioctl(fd,SIOCGIFHWADDR, pIfr) < 0)
{
perror("\nshowme::Skip ioctl SIOCGIFHWADDR, error: ");
fflush(stderr);
}
else
{
memcpy(mac,(unsigned char *)&(pIfr->ifr_hwaddr.sa_data),sizeof(struct sockaddr));
printf("\n[%d] MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
i,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
if ( ioctl(fd, SIOCGIFADDR, pIfr) < 0)
{
perror("\nshowme::Skip ioctl SIOCGIFADDR, error: ");
fflush(stderr);
}
else
{
memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
printf("\n[%d] Address = %s\n",i, inet_ntoa(addrtmp.sin_addr));
}
if ( ioctl(fd, SIOCGIFBRDADDR, pIfr) < 0)
{
perror("\nshowme::Skip ioctl SIOCGIFBRDADDR, error: ");
fflush(stderr);
}
else
{
memcpy(&addrtmp,&(pIfr->ifr_broadaddr),sizeof(addrtmp));
printf("\n[%d] BroadAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
}
if ( ioctl(fd, SIOCGIFNETMASK, pIfr) < 0)
{
perror("\nshowme::Skip ioctl SIOCGIFNETMASK, error: ");
fflush(stderr);
}
else
{
memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
printf("\n[%d] MaskAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
}
if ( ioctl(fd, SIOCGIFFLAGS, pIfr) < 0)
{
perror("\nshowme::Skip ioctl SIOCGIFFLAGS, error: ");
fflush(stderr);
}
else
{
printf("\n[%d] IFF_UP=%s\n",i, pIfr->ifr_flags&0x1?"ON":"OFF");
printf("\n[%d] IFF_BROADCAST=%s\n",i, pIfr->ifr_flags&0x2?"ON":"OFF");
printf("\n[%d] IFF_DEBUG=%s\n",i, pIfr->ifr_flags&0x4?"ON":"OFF");
printf("\n[%d] IFF_LOOPBACK=%s\n",i, pIfr->ifr_flags&0x8?"ON":"OFF");
printf("\n[%d] IFF_P2P=%s\n",i, pIfr->ifr_flags&0x10?"ON":"OFF");
printf("\n[%d] IFF_NOTRAILERS=%s\n",i, pIfr->ifr_flags&0x20?"ON":"OFF");
printf("\n[%d] IFF_RUNNING=%s\n",i, pIfr->ifr_flags&0x40?"ON":"OFF");
printf("\n[%d] IFF_NOARP=%s\n",i, pIfr->ifr_flags&0x80?"ON":"OFF");
}
}
fflush(stdout);
close(fd);
return 0;
}