Korzystając strace i ifconfig, stwierdziliśmy, że mogę ustawić adres IP w ten sposób:Jak ustawić adres IP z C w linux
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <string.h>
int main(int argc, const char *argv[]) {
struct ifreq ifr;
const char * name = "eth1";
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_addr.sa_family = AF_INET;
inet_pton(AF_INET, "10.12.0.1", ifr.ifr_addr.sa_data + 2);
ioctl(fd, SIOCSIFADDR, &ifr);
inet_pton(AF_INET, "255.255.0.0", ifr.ifr_addr.sa_data + 2);
ioctl(fd, SIOCSIFNETMASK, &ifr);
ioctl(fd, SIOCGIFFLAGS, &ifr);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
ioctl(fd, SIOCSIFFLAGS, &ifr);
return 0;
}
Ale nie jestem bardzo zadowolony z tego rozwiązania:
inet_pton(AF_INET, "10.12.0.1", ifr.ifr_addr.sa_data + 2);
Jaki jest "właściwy" sposób robienia tego?
Czy jest to coś, czego można się spodziewać często? Nie mogę sobie wyobrazić, że jest tam "ładny" programistyczny interfejs API, szczególnie jeśli tak robi ifconfig. (Dlaczego nie przeczytać źródła ifconfig?) Czy nie byłoby bezpieczniej zmienić wartości w/etc/sysconfig/network (lub gdziekolwiek znajduje się twoja dystrybucja) i zrestartować interfejsy sieciowe? – Rup
Ten kod nie działa na moim komputerze z OpenSUSE. Polecenie ifconfig wyświetla ten sam adres IP za każdym razem, gdy uruchamiam program. – 3bdalla
Wygląda na to, że potrzebuje uprawnień root'a. Zadziałało. Btw, dlaczego nie jesteś zadowolony z rozwiązania, o którym wspomniałeś – 3bdalla