2017-04-01 9 views
1

ioctlを使用して、ビーグルボーンブラックのIPアドレスをPythonで割り当てるプログラムを作成しました。 Linuxカーネルに実装IOCTL方法は、すべてのパラメータが必要Beagleboard IP割り当て用のstruct.pack()引数の意味

ため

(参照How to assign IP address to interface in python?Getting IP address of the beagleboard using pythonと)は、特定の構造に渡されます。したがって、私は構造体としてこれらのパラメータをすべて構築し、次にIOCTLに渡しました。

bin_ip = socket.inet_aton('192.168.0.1') 
ifreq = struct.pack('16sH2s4s8s', 'eth0', socket.AF_INET, '\x00'*2, bin_ip, '\x00'*8) 

sH

編集と書かれた数字16 2 4 8の意味は何であるかs= char[] and H = unsigned shortとしてhttps://docs.python.org/3.0/library/struct.htmlで最初の引数の部分的な意味を見つけた:「S」フォーマット文字の場合は、カウントがあると解釈されますバイトの長さは、例えば、16sは、4-byte string2-byte string1 unsigned short続い16-byte string単一8-byte string

なぜ4 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フィールドに基づいています:sin_familyはを設定はsocket.AF_INETあなたのコードで

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 
}; 

。次に、第4引数の2つのゼロはポートです。ここではIPアドレスが設定されているのでポート固有ではありません。その後、IPアドレスと最後に8つのゼロが来ます。

+0

ありがとうございます。私のコンセプトを明確にするのを助けました。 – daemon7osh

関連する問題