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

Python Beagleboard IP分配代码中struct.pack()参数的含义,python,linux,networking,beagleboneblack,struct.pack,Python,Linux,Networking,Beagleboneblack,Struct.pack,我正在编写一个程序,使用ioctl在python中为beaglebone black分配IP地址 (参考和) 因为在Linux内核中实现的IOCTL方法需要将所有参数传递到特定的结构中。因此,我将所有这些参数构造为一个结构,然后传递给IOCTL bin_ip = socket.inet_aton('192.168.0.1') ifreq = struct.pack('16sH2s4s8s', 'eth0', socket.AF_INET, '\x00'*2, bin_ip, '\x00'*8)

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

(参考和)

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

bin_ip = socket.inet_aton('192.168.0.1')
ifreq = struct.pack('16sH2s4s8s', 'eth0', socket.AF_INET, '\x00'*2, bin_ip, '\x00'*8)
在as
s=char[]和H=unsigned short
处找到第一个参数的部分含义用
s
H
编写的数字16 2 4 8的含义是什么

编辑:对于“s”格式字符,计数被解释为字节长度,例如,
16s
表示单个
16字节字符串
,后跟
1个无符号短字符串
2字节字符串
4字节字符串
8字节字符串


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

这里要打包的结构似乎是,其中设置了字段“ifr\u name”和“ifr\u addr”eth0'被设置为“ifr\u name”,而其余的是“ifr\u addr”

如果r\u addr是一个sockaddr,那么在本例中,我假设实际上是一个sockaddr\u 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_族。然后第四个参数两个零是端口,很可能是因为这里设置了IP地址,所以它不是特定于端口的。然后是ip地址,最后是八个零。

谢谢。帮我理清了很多概念。