구조체 맴버에 관한 질문입니다.

shs0917의 이미지

struct icmphdr
{
  u_int8_t type;                /* message type */
  u_int8_t code;                /* type sub-code */
  u_int16_t checksum;
  union
  {
    struct
    {
      u_int16_t id;
      u_int16_t sequence;
    } echo;                     /* echo datagram */
    u_int32_t   gateway;        /* gateway address */
    struct
    {
      u_int16_t __unused;
      u_int16_t mtu;
    } frag;                     /* path mtu discovery */
  } un;
};

이 코드에서 id라는 맴버와 sequence라는 맴버는 어떻게 사용해야 하는거죠?
struct icmphdr *icmph;
icmph -> ip 이렇게는 안되던데욤..
답변 부탁 드립니다.
sliver의 이미지

struct icmphdr *p;
p->un.echo.id로 접근할 수 있습니다.

shs0917의 이미지

근데.. 저런 문법은 잘 모르겠는데..
저런식으로 구조체를 만드는건 어떤 의미인지 설멍좀 해주시면
감사하겠습니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

shs0917의 이미지

구조체 안에서 구조체를 또 선언하기 위해서 저런거 같은데..
union이라는 구조체형으로 선언한다는건지..
쩝.. 아직도 잘 모르겠군요..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

lu4moon의 이미지

  union 
  { 
    struct 
    { 
      u_int16_t id; 
      u_int16_t sequence; 
    } echo;                     /* echo datagram */ 
    u_int32_t   gateway;        /* gateway address */ 
    struct 
    { 
      u_int16_t __unused; 
      u_int16_t mtu; 
    } frag;                     /* path mtu discovery */ 
  } un; 

에..union(=공용체) 안에다 이름없는 구조체변수 echo와 frag를 선언한겁니다.
이표현이 맞을지는 모르겠네요.

union의 특성상 크기상으로는 32bit밖에 사용하지 않습니다

union에 대한 걸 알아보시길..

생각해보니 대학들어가서 처음 C배울때 교수님께서 "union같은거 잘안쓰니 그냥 이런게 있다 정도만 알고 넘어가라"고 말씀하셨는데, 이런방법으로도 쓸수 있군요. 좋은거 배웠습니다. 감사합니다

You wrote 'fool self' magic on your book.

girneter의 이미지

저도 union 은 별로 맘에 안 들어서
공부도 안 하고 한 번도 안 썼는데,
이번에 회사 프로젝트에서
매우 요긴하게 쓰고 있습니다.

어떤 경우냐 하면,
각 thread 가 자신의 msgq 에서 msg 를 기다리고
다른 thread 에게 msg 를 보내는데,
이 msg 의 크기가 경우에 따라 달라지거든요.
(명령에 따른 매개변수의 수가 다르므로)

이럴 때 어떤 thread 가 받을 수 있는 msg 들을
모두 하나의 union 으로 묶은 다음에
실제 어떤 msg 가 담겨있는가를 구분하는 값 하나랑
함께 그 thread 에게 보냅니다.
이렇게 하니까 다른 방식보다 훨씬 좋던데요.

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

shs0917의 이미지

이게 공용체인가 하는 그거였나요?? 언제 들어는 본거 같은데..
네트웍 보안 프로그래밍 하다가 구조체를 볼 일이 있어서 헤더 봤뜨만..
icmp 구조체가 리눅스에서 저렇게 선언 되었더라구요..
공용체에 대해서 공부해야 겠꾼요..
그럼 모두들 즐플 하세욤~

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

samdochen의 이미지

모든 네트워크 정보를 출력하려고 합니다.
다른 모든 정보(ip,netmask,mac등)이런건 됐는데,
gateway만 잘 안되고있거든요.
검색하다 보니 icmphdr이라는 구조체안을 보니 gateway가 있는데.
이걸 사용하면 gateway를 출력할수 있는지요.
또 그렇다면 어떻게 사용하는지도 좀 부탁합니다.
예를 들어 printf를 사용하면 출력변수는 %d라든지 %s라든지,
또 이것도 inet_ntoa를 사용해서 변환 해주어 하는지 등이요...

newmania의 이미지

프로토콜 같은 경우에 UNION 을 사용하는 경우라면

[헤더A] [데이터A] [헤더B] [테이터B]
[헤더A] [데이터A] [헤더C] [테이터C]
[헤더A] [데이터A] [헤더D] [테이터D]

위와 같이 프로토콜 스택이 구성된다고 했을 때 데이터A 의 내용을
참조하여 이후의 의미가 달라진다면 또한 데이터A 뒤에 따라오는
내용을 독립적으로 파싱해야겠지요. 게다가 데이터A 뒤에 따라오는
내용의 길이가 제각각이면 코드가 복잡해지겠지요. 때문에 UNION
을 사용하여 데이터 A 의 내용을 참조하여 거기에 맞는 구조체에
매핑시켜 사용할 수 있습니다.

[데이터A] : 헤더B => 헤더B 에 구조체에 매핑 => 헤더B / 데이터 B해석
[데이터A] : 헤더C => 헤더C 에 구조체에 매핑 => 헤더C / 데이터 C해석
[데이터A] : 헤더D => 헤더D 에 구조체에 매핑 => 헤더D / 데이터 D해석

아는 것이 별로 없어서... ^^; 도움이 되길 바랍니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.