реклама на сайте
подробности

 
 
> Как установить новый ip-адрес интерфейса программно?
Atridies
сообщение Nov 30 2014, 14:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Здравствуйте!

Есть задача - установить новый ip-адрес интерфейса из работающей программы. Из консоли делается просто: "ifconfig eth0 inet 192.168.1.10".
Попробовал аналогично вызвать ifconfig из пользовательской программы:

Код
int main(int argc, char* argv[], char* enpv[])
{
    pid_t num;
    int status;
    num = fork();
    if(num == 0)
    {
        execl("ifconfig", "eth0", "inet", "10.0.2.16");
    }
    else
    {
        wait(&status);
        printf("ending");
    }
    return 0;
}


Запускаю, проверяю - адрес не меняется. Что я делают не так? Запускаю эту программу под рутом.
Менять адрес через перезапись в файлах конфигурации - не хочу, т.к. у разных дистрибутивов эти файлы лежат в разных папках.

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Atridies
сообщение Dec 5 2014, 15:39
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Спасибо за ответы. Несколько дней понадобилось, чтобы разобраться с ioctl.

Код - как у psL:

Код
s = socket(AF_INET,SOCK_DGRAM,0); //temporary socket

memset(&ifr, 0, sizeof(struct ifreq));
memset(&sin, 0, sizeof(struct sockaddr));
strncpy(ifr.ifr_name, "eth0", IF_NAMESIZE-1);
sin.sin_family = AF_INET;

sin.sin_addr.s_addr = inet_addr("192.168.0.123");

memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));

if(ioctl(s, SIOCSIFADDR, &ifr)< 0) //set IP-Adress and check for errors
{ /*close(s);*/ }
close(s);



Но проблема в том, что опять ничего не работает. На машине Ubuntu все отлично работает: адрес меняется. Когда запускаю этот код в Angstrom - нифига не пашет. Вот что пишет ifconfig -a.

Код
eth0      Link encap:Ethernet  HWaddr BC:6A:29:57:11:80
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr BC:6A:29:57:11:81
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


Запускаю из-под рута. Может разрешений не хватает ? Но ведь из sh - все задается.
Go to the top of the page
 
+Quote Post
alx2
сообщение Dec 9 2014, 05:47
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Atridies @ Dec 5 2014, 21:39) *
Но проблема в том, что опять ничего не работает.
Запускаю из-под рута. Может разрешений не хватает ?

В Вашем коде два системных вызова. Очевидно, один из них завершается ошибкой. Так обработайте должным образом эту ошибку и выведите ее на экран. Тогда и не придется гадать о том, чего программе не хватает. Хотя бы как-то так:
Код
s = socket(...);
if(s < 0) {
  perror("socket");
  exit(1);
}
...
if(ioctl(...) < 0)
  perror("ioctl");



--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 16:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016