Bằng cách sử dụng strace và ifconfig, tôi thấy rằng tôi có thể thiết lập địa chỉ IP theo cách này:Làm thế nào để thiết lập địa chỉ IP từ C trong 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;
}
Nhưng tôi không phải là rất hài lòng với giải pháp này:
inet_pton(AF_INET, "10.12.0.1", ifr.ifr_addr.sa_data + 2);
Cách "đúng" để thực hiện việc này là gì?
Đây có phải là điều bạn muốn làm thường xuyên không ?? Tôi không thể tưởng tượng có một API 'lập trình' tốt đẹp cho nó, đặc biệt nếu đó là cách ifconfig làm điều đó. (Tại sao không đọc nguồn ifconfig?) Nó sẽ không an toàn hơn để thay đổi các giá trị trong/etc/sysconfig/network (hoặc bất cứ nơi nào distro của bạn giữ nó) và khởi động lại các giao diện mạng? – Rup
Mã không hoạt động trên máy openSUSE của tôi. Lệnh Ifconfig tiếp tục hiển thị cùng một IP mỗi khi tôi chạy chương trình – 3bdalla
Có vẻ như nó cần quyền root. Nó đã làm việc. Btw tại sao bạn không hài lòng với giải pháp mà bạn đã đề cập – 3bdalla