Beagleboard IP 分配代码中 struct.pack( ) 参数的含义

Meaning of struct.pack( ) arguments in code for Beagleboard IP assignment

我正在编写一个程序,使用 ioctl 为 python 中的 beaglebone black 分配 IP 地址。

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

因为 IOCTL 方法在 Linux 中实现,内核需要将所有参数传递到特定结构中。因此,我将所有这些参数构建为一个结构,然后传递给 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 shortsH

写的数字 16 2 4 8 的含义是什么

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

为什么第 4 个参数是 '\x00\x00' 而最后一个参数是 '\x00\x00\x00\x00\x00\x00\x00\x00'?这是标准格式/预期格式吗?

此处打包的结构似乎是 ifreq,其中设置了字段 "ifr_name" 和 "ifr_addr"。 'eth0' 为 "ifr_name" 设置,而其余为 "ifr_addr"。

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

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 地址,最后是八个零。