[완료]C언어 구조체 문법 질문과 udhcp소스에 관한 질문입니다.
글쓴이: visualplus / 작성시간: 수, 2008/08/13 - 11:47오전
제가 지금 udhcpc소스를 분석해보고 있는데 이해가 안되는 문법이 있어서 질문 올리게 됐습니다.
우선 제가 이해가 안되는 소스는
struct client_config_t client_config = { /* Default options. */ abort_if_no_lease: 0, foreground: 0, quit_after_lease: 0, background_if_no_lease: 0, interface: "eth0", pidfile: NULL, script: DEFAULT_SCRIPT, clientid: NULL, hostname: NULL, ifindex: 0, arp: "\0\0\0\0\0\0", /* appease gcc-3.0 */ };
요부분입니다. client_config_t는
struct client_config_t { char foreground; /* Do not fork */ char quit_after_lease; /* Quit after obtaining lease */ char abort_if_no_lease; /* Abort if no lease */ char background_if_no_lease; /* Fork to background if no lease */ char *interface; /* The name of the interface to use */ char *pidfile; /* Optionally store the process ID */ char *script; /* User script to run at dhcp events */ unsigned char *clientid; /* Optional client id to use */ unsigned char *hostname; /* Optional hostname to use */ int ifindex; /* Index number of the interface to use */ unsigned char arp[6]; /* Our arp address */ };
이렇게 되어있습니다.
제가 이해가 안되는것은 위 소스 중 구조체 선언에서
abort_if_no_lease: 0 이런것과 같이 name:value 요 구조를 잘 모르겠습니다.
저렇게 하면 client_config_t값중 foreground여기에 값이 들어가는건가요?
이것이 궁금합니다.
또. 이것은 dhcp패킷에 관한 질문인데..
dhcp option패킷을 만드는 부분인것 같은데..
int add_option_string(unsigned char *optionptr, unsigned char *string) { int end = end_option(optionptr); if (end + string[OPT_LEN] + 2 + 1 >= 308) { return 0; } memcpy(optionptr + end, string, string[OPT_LEN] + 2); optionptr[end + string[OPT_LEN] + 2] = DHCP_END; return string[OPT_LEN] + 2; }
요부분에서 dhcp option메세지 포맷인
┌──────┬───────┬───────┐ │Options Code│ Option Length│ Option Data │ └──────┴───────┴───────┘
이 구조가 안맞는거 같습니다.
이 함수를 호출하면서 string에 들어가는 값은
client_config중 한가지의 값이 들어가는데..
option data이것만 주는꼴이 되는것 같습니다.
그렇다면 dhcp option패킷을 만드는 과정에서 option data의 길이와 code를 구해서
알맞게 넣어줘야 하는것 같은데..
제가 보기에는 그런 부분이 안보입니다..
혹시 저에게 도움을 주실 분이 계신가요..
Forums:
1. 구조체에서
1. 구조체에서 name:value로 되어 있는 부분을 다시 한번 보시면
struct client_config_t client_config =
의 형식으로 되어 있습니다. 즉, 값을 넣어주는게 되겠죠...
name:value 로 굳이 하지 않고 value로만 해도 상관은 없지만 name을 명시해준 이유는 가독성 때문에 넣어준거로 보입니다.
struct client_config_t client_config = {
/* Default options. */
abort_if_no_lease: 0,
foreground: 0,
quit_after_lease: 0,
background_if_no_lease: 0,
....
}
이나
struct client_config_t client_config = {
/* Default options. */
0,
0,
0,
0,
....
}
은 같다는 이야기입니다..
2. int add_option_string(unsigned char *optionptr, unsigned char *string)
int end = end_option(optionptr);
=> 리턴받는 값이 optionptr의 end_point가 표시된 부분의 위치 offset을 리턴해줄테고,
if (end + string[OPT_LEN] + 2 + 1 >= 308) {
return 0;
}
=> packet 크기가 제한이겠군요...
memcpy(optionptr + end, string, string[OPT_LEN] + 2);
=> OPT_LEN이 정확하게 의미하는 바가 뭔지는 모르겠지만, 아마도 string에서 길이를 표현하는 부분이 되겠군요..
visualplus님이 얘기하신 것처럼 code : length : data의 순서라면
data의 길이가 0 이라면 code와 length만 optionptr에 copy,
data의 길이가 10 이라면 code와 length, 그리고 data까지 copy 겠네요...
아마도, memcpy(optionptr + end, &string[2], string[OPT_LEN] + 2); 와 착각하신듯...;;
optionptr[end + string[OPT_LEN] + 2] = DHCP_END;
=> data 다음의 부분을 DHCP_END로 끝부분을 표시해주는 게 되겠군요.
return string[OPT_LEN] + 2;
=> code, length 각 1byte, length 값을 return
감사합니다
정말 감사합니다..ㅠㅠ
이런 고수님에게 답글을 받다니~~
도움 많이 됐습니다^^
댓글 달기