Re: lug-bg: 2 isp-та и 2 локални мрежи на един интерфеис
- Subject: Re: lug-bg: 2 isp-та и 2 локални мрежи на един интерфеис
- From: Евгени Каралъмов <fb@xxxxxxxxxxxx>
- Date: Thu, 23 Sep 2004 16:20:25 +0300
Marian D Marinov написа:
> Предварително искам да се извиня за некадърно написаното взимане на ИП адреса
> ама за това се сетих сега това написах :) Което ме навежда на мисълта защно
> не заформим една тема относно скриптове за взимане на динамично зададен ИП
> адрес точно за firewalls и shapers?
>
> Поздрави
> М.Маринов
Зная че не е уместно реализирането на подобна елементарна задача на C
поради редица причини, но въпреки това ето един (повърхностен, без ipv6
и т.н.) пример как програмно могат да се правят такива неща. За някого
може да е от полза.
Компилира се с "gcc -s -o inetaddrof inetaddrof.c" и после "./inetaddrof
eth0" например.
#include <arpa/inet.h>
#include <linux/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
int main(int ARGC, char *ARGV[])
{
fclose(stdin);
if(2 != ARGC)
{
fprintf(stderr, "Usage: %s interface_name\n", *ARGV);
return EXIT_FAILURE;
}
if(strlen(*(ARGV + 1)) >= IFNAMSIZ)
{
fprintf(stderr, "%s: too long to be an interface name\n", *(ARGV + 1));
return EXIT_FAILURE;
}
int f = socket(PF_INET, SOCK_DGRAM, 0);
if(-1 == f)
{
perror("socket");
return EXIT_FAILURE;
}
struct ifreq ifr;
strcpy((char*)&ifr, *(ARGV + 1));
if(-1 == ioctl(f, SIOCGIFADDR, &ifr))
{
perror("ioctl");
return EXIT_FAILURE;
}
printf("%s", inet_ntoa(((struct sockaddr_in*)&ifr.ifr_ifru.ifru_addr)->sin_addr));
return EXIT_SUCCESS;
}
|