1

我正在编写一个程序,在 python 中使用ioctl.

(参考How to assign IP address to interface in python?Getting IP address of the beagleboard using python

由于IOCTL在 Linux Kernel 中实现的方法需要将所有参数传递到特定的结构中。因此,我将所有这些参数构造为一个结构,然后传递给IOCTL.

bin_ip = socket.inet_aton('192.168.0.1')
ifreq = struct.pack('16sH2s4s8s', 'eth0', socket.AF_INET, '\x00'*2, bin_ip, '\x00'*8)

在https://docs.python.org/3.0/library/struct.html发现第一个参数的部分含义是 s= char[] and H = unsigned short数字 16 2 4 8 的s含义H

编辑:对于 's' 格式字符,计数被解释为字节的长度,例如,16s表示单个16-byte string后跟1 unsigned short, 2-byte string, 4-byte string,8-byte string

为什么第四个论点是'\x00\x00',最后一个论点是'\x00\x00\x00\x00\x00\x00\x00\x00'?这是标准格式/预期格式吗?

4

1 回答 1

0

似乎这里打包的结构是ifreq,其中设置了“ifr_name”和“ifr_addr”字段。'eth0' 设置为“ifr_name”,而其余设置为“ifr_addr”。

Ifr_addr 是一个 sockaddr,在这种情况下我想实际上是一个 sockaddr_in。基于此页面,字段为:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

在您的代码中,socket.AF_INET 设置了 sin_family。然后第四个参数两个零是端口,可能因为这里设置了 IP 地址,所以它不是特定于端口的。然后是 IP 地址,最后是八个零。

于 2017-04-01T17:00:07.970 回答