【问题标题】:Trying to set the IP address from C program尝试从 C 程序设置 IP 地址
【发布时间】:2021-10-02 10:39:32
【问题描述】:

我正在尝试使用 C 代码更改树莓派的 IP 地址。但是当我运行代码时,我可以使用我提供的新 IP 连接到树莓派。但是如果我重新启动树莓派或网络服务,它会回到原来的 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;
}

通常树莓派的地址是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 范围全局 noprefixroute eth0

inet 192.168.4.28/24 范围全局辅助 noprefixroute eth0

简而言之,我怎样才能确保我要给的IP是主要的和永久的。

【问题讨论】:

  • 我使用了struct ifreq ifr; --> struct ifreq ifr = {0}; 来完全初始化ifr。还要检查socket() 和其他函数的返回值。

标签: c linux networking raspberry-pi network-programming


【解决方案1】:

如您在示例中所做的那样固定 IP 地址只会更改适配器的“当前”IP。

当 Raspberry 启动时,它会从 init 脚本中设置 IP 地址,这就是您需要修改以使更改永久生效的内容。

它使用什么样的脚本取决于你使用的发行版,可能是 systemd。您可以编写一个程序来使用系统工具来设置该信息,或修改文本文件。

如果是 systemd 脚本/文件,它们通常位于 /etc/systemd/network,这里是 manual page from systemd

【讨论】:

  • 地址可能是通过 DHCP 设置的。您需要将其关闭并配置 RPI 以使用手动配置的 IP 地址。很可能所有这些都是由网络管理器守护进程完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2016-06-13
  • 2012-01-09
  • 1970-01-01
  • 2015-01-29
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多