当前位置: 首页 > 面试题库 >

如何在Linux中从C设置IP地址

翟弘
2023-03-14
问题内容

通过使用strace和ifconfig,我发现可以通过以下方式设置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 = "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;
}

但是我对这种解决方案不是很满意:

inet_pton(AF_INET, "10.12.0.1", ifr.ifr_addr.sa_data + 2);

这样做的“正确”方法是什么?


问题答案:

没有魔术+2的IPv4的“正确”方式:

struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
inet_pton(AF_INET, "10.12.0.1", &addr->sin_addr);

要使用IPv6,请将其强制转换为 sockaddr_in6



 类似资料:
  • 我必须在ConsumerGroup中设置zookeeper IP地址,而不是Kafka-Host IP地址。因为我将复制因子设置为3,并且创建了3个代理。因此,如果一个主机出现故障,那么另一个主机可以接管。 当我尝试将zookeeper的IP地址而不是Kafka-Host的IP地址放在ConsumerGroup中时,它不会接收到任何来自生产者API的消息。 我希望这样,如果我在ConsumerGr

  • 问题内容: 我如何获得我的IP地址(最好是格式)? 问题答案: 此示例代码列出了计算机上存在的所有IPv4网络接口的接口名称(例如或)以及当前分配的IP地址:

  • 问题内容: 我已经在Web项目的jsp / servlet中创建了一个登录应用程序,我想知道访问我的登录页面的不同用户的地理位置。我怎么知道某个人正在从哪里访问我的登录页面?例如:如果某人正在访问加拿大的页面,那么一条记录将插入到我的数据库中,例如:IP:20.4.9.134和位置:Canada。 问题答案: 我用这个: http://freegeoip.net/xml/122.169.8.137

  • 我正在使用授权。net PHP SDK在我们的网站上进行信用卡支付。目前,我正在向客户发送账单,包括客户名、姓氏、地址、邮政编码、城市、州、国家和电子邮件。我还需要发送客户ip地址。请提出解决方案。当前代码的一部分如下所示:

  • 但是,这给了我127.0.1.1的IP地址。当我使用时,我得到以下信息 首先,我不知道127.0.1.1是从哪里来的,但不管怎样,这都不是我想要的。当我谷歌的时候,我总是看到相同的语法,Bash脚本或netifaces,我试图使用标准库。 那么如何在Python中获取eth0的IP地址呢?

  • 问题内容: 我需要使用C语言显示本地计算机上的所有IP地址。如何才能做到这一点? 问题答案: