구조체 맴버에 관한 질문입니다.
글쓴이: shs0917 / 작성시간: 수, 2003/08/27 - 3:05오전
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 이렇게는 안되던데욤..
답변 부탁 드립니다.
Forums:
struct icmphdr *p;p->un.echo.id로 접근
struct icmphdr *p;
p->un.echo.id로 접근할 수 있습니다.
답변 감사합니다.
근데.. 저런 문법은 잘 모르겠는데..
저런식으로 구조체를 만드는건 어떤 의미인지 설멍좀 해주시면
감사하겠습니다.
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
제생각에는요..
구조체 안에서 구조체를 또 선언하기 위해서 저런거 같은데..
union이라는 구조체형으로 선언한다는건지..
쩝.. 아직도 잘 모르겠군요..
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
이부분은..
에..union(=공용체) 안에다 이름없는 구조체변수 echo와 frag를 선언한겁니다.
이표현이 맞을지는 모르겠네요.
union의 특성상 크기상으로는 32bit밖에 사용하지 않습니다
union에 대한 걸 알아보시길..
생각해보니 대학들어가서 처음 C배울때 교수님께서 "union같은거 잘안쓰니 그냥 이런게 있다 정도만 알고 넘어가라"고 말씀하셨는데, 이런방법으로도 쓸수 있군요. 좋은거 배웠습니다. 감사합니다
You wrote 'fool self' magic on your book.
union
저도 union 은 별로 맘에 안 들어서
공부도 안 하고 한 번도 안 썼는데,
이번에 회사 프로젝트에서
매우 요긴하게 쓰고 있습니다.
어떤 경우냐 하면,
각 thread 가 자신의 msgq 에서 msg 를 기다리고
다른 thread 에게 msg 를 보내는데,
이 msg 의 크기가 경우에 따라 달라지거든요.
(명령에 따른 매개변수의 수가 다르므로)
이럴 때 어떤 thread 가 받을 수 있는 msg 들을
모두 하나의 union 으로 묶은 다음에
실제 어떤 msg 가 담겨있는가를 구분하는 값 하나랑
함께 그 thread 에게 보냅니다.
이렇게 하니까 다른 방식보다 훨씬 좋던데요.
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
다변 감사합니다
이게 공용체인가 하는 그거였나요?? 언제 들어는 본거 같은데..
네트웍 보안 프로그래밍 하다가 구조체를 볼 일이 있어서 헤더 봤뜨만..
icmp 구조체가 리눅스에서 저렇게 선언 되었더라구요..
공용체에 대해서 공부해야 겠꾼요..
그럼 모두들 즐플 하세욤~
컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러
모든 네트워크 정보를 출력하려고 합니다.다른 모든 정보(ip,netm
모든 네트워크 정보를 출력하려고 합니다.
다른 모든 정보(ip,netmask,mac등)이런건 됐는데,
gateway만 잘 안되고있거든요.
검색하다 보니 icmphdr이라는 구조체안을 보니 gateway가 있는데.
이걸 사용하면 gateway를 출력할수 있는지요.
또 그렇다면 어떻게 사용하는지도 좀 부탁합니다.
예를 들어 printf를 사용하면 출력변수는 %d라든지 %s라든지,
또 이것도 inet_ntoa를 사용해서 변환 해주어 하는지 등이요...
프로토콜 같은 경우에 UNION 을 사용하는 경우라면[헤더A] [
프로토콜 같은 경우에 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해석
아는 것이 별로 없어서... ^^; 도움이 되길 바랍니다.
댓글 달기