Beagleboard IP赋值的代码中struct.pack()参数的含义

时间:2017-04-01 16:00:40

标签: python linux networking beagleboneblack struct.pack

我正在编写一个程序,使用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用sH

写的

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

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

1 个答案:

答案 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个零。