2017-04-01 4 views
1

ioctl을 사용하여 비글 본 검정색 IP 주소를 비단뱀에 할당하는 프로그램을 작성했습니다. 리눅스 커널 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)이 4 ~ 8의 의미가 무엇인지 s= char[] and H = unsigned shorthttps://docs.python.org/3.0/library/struct.html에서 첫 번째 인수의 부분적인 의미를 발견 다음의 '형식 문자의 경우, 카운트로 해석됩니다 바이트의 길이는, 예를 들면, 16s는, 4-byte string, 2-byte string, 1 unsigned short 다음 16-byte string 단일 8-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을 기반으로 필드는 다음과 같습니다 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 
}; 

합니다. 그런 다음 네 번째 인수 인 두 개의 0이 포트입니다. IP 주소가 여기에 설정된 것처럼 포트 특정이 아닙니다. 그런 다음 IP 주소와 마지막으로 8 개의 0이옵니다.

+0

감사합니다. 내 개념을 정리하는 데 많은 도움을주었습니다. – daemon7osh