[완료]C언어 구조체 문법 질문과 udhcp소스에 관한 질문입니다.

visualplus의 이미지

제가 지금 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를 구해서
알맞게 넣어줘야 하는것 같은데..
제가 보기에는 그런 부분이 안보입니다..

혹시 저에게 도움을 주실 분이 계신가요..

mirr187의 이미지

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

visualplus의 이미지

정말 감사합니다..ㅠㅠ
이런 고수님에게 답글을 받다니~~
도움 많이 됐습니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.