2017-04-01 38 views
1

我正在编写一个程序,使用ioctl在Python中为beaglebone black分配IP地址。Beagleboard IP分配代码中struct.pack()参数的含义

(参考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什么是与sH

编辑写入编号16 2 4 8的含义:对于“S”格式字符,计数被解释为字节的长度,例如,16s手段单一16-byte string随后1 unsigned short2-byte string4-byte string8-byte string

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

回答

1

看来这里打包的结构是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地址,最后是八个零。

+0

谢谢。帮助我清理了我的概念。 – daemon7osh