- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过 C 程序设置网络接口(interface)的 IP 地址。我环顾四周,发现我可以使用 ioctl()
和 inet_pton()
来完成。我的问题是,我不知道我应该在 struct ifreq
中的什么地方存储转换后的地址。我一直收到 ioctl() - invalid argument
错误。
我特别看了这个例子 How to set the IP address from C in linux .这表示我们可以将 ifr.ifr_addr
转换为 struct sockaddr_in
。但是,在进行地址转换后,ioctl()
因参数无效错误而失败。
代码如下:
280 void setip (int fd) {
281
282 struct ifreq ifr;
283 struct sockaddr_in * addr;
284 int stat;
285
286 strcpy(ifr.ifr_name, in.dev.device); // in.dev.device = tun2
287 addr = (struct sockaddr_in *) &ifr.ifr_addr;
288
289 addr->sin_family = AF_INET;
290
291 stat = inet_pton(addr->sin_family, in.dev.ip_addr, &addr->sin_addr); // in.dev.ip_addr = "100.0.0.10"
292 if (stat == 0)
293 raise_error("inet_pton() - invalid ip");
294 if (stat == -1)
295 raise_error("inet_pton() - invalid family");
296
297 if (stat == 1);
298 else
299 raise_error("inet_pton()");
300
301 /* This is just to test if address conversion happened properly */
302 char buff[BUFF_SIZE];
303 char * foo;
304 foo = inet_ntop(AF_INET, &addr->sin_addr, buff, BUFF_SIZE);
305 if (foo == NULL)
306 raise_error("inet_ntop()");
307 else
308 printf("main = %s, addr = %s\n",in.dev.ip_addr, buff);
309
310 if (ioctl(fd, SIOCSIFADDR, &ifr, sizeof(ifr)) == -1)
311 raise_error("ioctl() - SIOCSIFADDR");
312 }
编辑:raise_error
函数是:
void raise_error (const char * msg) {
perror(msg);
exit(1);
}
我得到的输出是:
main = 100.0.0.10, addr = 100.0.0.10
ioctl() - SIOCSIFADDR: Invalid argument
我猜测转换后的地址在 struct ifreq
中被放置在错误的位置,但我无法弄清楚它应该放置在什么位置。我还尝试使用 ifr.ifr_addr
进行地址转换,但也没有用。
编辑:我正在以 root 身份运行该程序。
任何帮助将不胜感激。如果我需要发布更多代码或调试输出,请告诉我。
谢谢
最佳答案
我认为您看到了错误的错误消息,因为 raise_error
在 perror
之前调用了另一个函数,并且您看到的是该调用的结果而不是 ioctl
.. 您应该始终在要测试的函数之后立即调用 perror
。我尝试了您的代码,ioctl()
失败并显示“ioctl(): Permission denied”,您需要以 root 身份运行它(另请注意,您不需要传递 ifreq 的大小
)
关于c - 如何使用 inet_pton 和 struct ifreq 从 C 程序设置 ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17893704/
我想使用 struct ifreq,但当我执行以下操作时无法访问它:代码是: 1 #include 2 #include 3 #include 4 #include 5 #
我正在尝试编译以下单个 C 文件(称为 main.c): #include #define __USE_MISC 1 #include int main(int argc, char **argv
我必须获取接口(interface)的 MAC 地址,并且我将 ifaddr 结构与 getifaddrs 一起使用。而且运行良好。但在我的其余工作中,我使用 ifreq 结构。所以我需要将地址从第一
我正在使用以下代码: struct sockaddr_in6 *sin; struct ifreq ifr; sin = (struct sockaddr_in6 *)&ifr.ifr_addr; i
以下函数确定给定字符串是否为有效的网络设备名称。 int isValidNDevice(char *name) { char data[4096]; struct ifconf ifc
我们有一个运行 BusyBox Linux(内核 2.6.x)的嵌入式 SoC,我们需要在网络连接断开或接通时进行监控或至少及时通知(捕获其他事件会很好,但是不是必需的)。 我花了很长时间在谷歌上搜索
在在线手册页 netdevice(7) - Linux man page , ifreq 结构的定义为: struct ifreq { char ifr_name[IFN
我在检索 VMware 上运行的虚拟服务器上的硬件地址时遇到一些问题。 我曾经使用 C 函数在独立的 Linux 服务器上获取硬件地址 ioctl(sd, SIOCETHTOOL, &ifreq) 现
我正在尝试通过 C 程序设置网络接口(interface)的 IP 地址。我环顾四周,发现我可以使用 ioctl() 和 inet_pton() 来完成。我的问题是,我不知道我应该在 struct i
我是一名优秀的程序员,十分优秀!