我正在编写一个程序,使用ioctl
在python中为beaglebone black分配IP地址。
(参考How to assign IP address to interface in python?和Getting IP address of the beagleboard using python)
由于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)
在https://docs.python.org/3.0/library/struct.html找到第一个参数的部分含义为s= char[] and H = unsigned short
数字的含义16 2 4 8用s
和H
编辑:对于'格式字符,计数被解释为字节的长度,例如,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'
?这是标准格式/预期格式吗?
答案 0 :(得分:1)
这里打包的结构似乎是ifreq,其中字段" ifr_name"和" ifr_addr"得到了设定。 ' eth0的'设置为" ifr_name",其余部分设置为" ifr_addr"。
ifr_addr是一个sockaddr,在这种情况下,我想实际上是一个sockaddr_in。根据{{3}},字段为:
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地址,最后是8个零。