尝试从 C 程序设置 IP 地址
Trying to set the IP address from C program
我正在尝试用 C 代码更改 raspberry pi 的 IP 地址。但是当我 运行 代码时,我可以使用我提供的新 IP 连接到 raspberry pi。但是,如果我重新启动 raspberry pi 或网络服务,它将返回到其旧 IP。
#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 = "eth0";
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_addr.sa_family = AF_INET;
struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
inet_pton(AF_INET, "192.168.4.27", &addr->sin_addr);
ioctl(fd, SIOCSIFADDR, &ifr);
ioctl(fd, SIOCGIFFLAGS, &ifr);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
ioctl(fd, SIOCSIFFLAGS, &ifr);
return 0;
}
通常raspberry pi的地址是192.168.4.28,我想换成192.168.4.27。当我 运行 它时,我没有收到任何错误,我可以连接到 192.168.4.27。另外,我可以连接到 192.168.4.28。所以可以连接两个IP。当我键入“ifconfig”时,我可以看到 IP 已更改为 192.168.4.27。当我输入“ip addr”时,我得到了这个;
eth0 :
inet 192.168.4.27/24 scope global noprefixroute eth0
inet 192.168.4.28/24 scope global secondary noprefixroute eth0
简而言之,如何确保我要给的IP是主要的和永久的。
像您在示例中那样固定 IP 地址只会更改适配器的 'current' IP。
当 Raspberry 启动时,它会从 init 脚本设置 IP 地址,这就是您需要修改的内容,以便使更改永久生效。
它使用什么样的脚本取决于你使用的发行版,可能是systemd。您可以制作一个程序来使用系统工具来设置该信息,或修改文本文件。
如果是 systemd scripts/files,它们通常在 /etc/systemd/network,这里是 manual page from systemd
我正在尝试用 C 代码更改 raspberry pi 的 IP 地址。但是当我 运行 代码时,我可以使用我提供的新 IP 连接到 raspberry pi。但是,如果我重新启动 raspberry pi 或网络服务,它将返回到其旧 IP。
#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 = "eth0";
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_addr.sa_family = AF_INET;
struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
inet_pton(AF_INET, "192.168.4.27", &addr->sin_addr);
ioctl(fd, SIOCSIFADDR, &ifr);
ioctl(fd, SIOCGIFFLAGS, &ifr);
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
ioctl(fd, SIOCSIFFLAGS, &ifr);
return 0;
}
通常raspberry pi的地址是192.168.4.28,我想换成192.168.4.27。当我 运行 它时,我没有收到任何错误,我可以连接到 192.168.4.27。另外,我可以连接到 192.168.4.28。所以可以连接两个IP。当我键入“ifconfig”时,我可以看到 IP 已更改为 192.168.4.27。当我输入“ip addr”时,我得到了这个;
eth0 :
inet 192.168.4.27/24 scope global noprefixroute eth0
inet 192.168.4.28/24 scope global secondary noprefixroute eth0
简而言之,如何确保我要给的IP是主要的和永久的。
像您在示例中那样固定 IP 地址只会更改适配器的 'current' IP。
当 Raspberry 启动时,它会从 init 脚本设置 IP 地址,这就是您需要修改的内容,以便使更改永久生效。
它使用什么样的脚本取决于你使用的发行版,可能是systemd。您可以制作一个程序来使用系统工具来设置该信息,或修改文本文件。
如果是 systemd scripts/files,它们通常在 /etc/systemd/network,这里是 manual page from systemd