ioctl 관련 질문입니다.

swunk의 이미지

UNP 책에 나온 소스 입니다.
하나의 시스템에 할당된 ip 주소를 가지고 이에 해당 하는 mac 주소를 프린트하는 소스 코드 입니다.
ioctl을 사용하고 cmd로 SIOCGARP를 사용합니다.
그런데 아래와 같이 mac 주소가 출력이 안되네요...
뭐가 문젤까요 ?

127.0.0.1: ioctl SIOCGARP: No such device
130.154.16.209: ioctl SIOCGARP: No such device
10.1.1.1: ioctl SIOCGARP: No such device
10.4.1.1: ioctl SIOCGARP: No such device

소스 코드는 아래와 같습니다.
참고로 get_ifi_info() 함수는 시스템에 network interface 정보를 가져 오는 함수입니다.

  1 #include        "unpifi.h"
      2 #include        <net/if_arp.h>
      3
      4 int
      5 main(int argc, char **argv)
      6 {
      7         int                                     sockfd;
      8         struct ifi_info                 *ifi;
      9         unsigned char           *ptr;
     10         struct arpreq           arpreq;
     11         struct sockaddr_in      *sin;
     12
     13         sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
     14         for (ifi = get_ifi_info(AF_INET, 0); ifi != NULL; ifi = ifi->ifi_next) {
     15                 printf("%s: ", Sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr_in)));
     16
     17                 sin = (struct sockaddr_in *) &arpreq.arp_pa;
     18                 memcpy(sin, ifi->ifi_addr, sizeof(struct sockaddr_in));
     19
     20                 if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {
     21                         err_ret("ioctl SIOCGARP");
     22                         continue;
     23                 }
     24
     25                 ptr = &arpreq.arp_ha.sa_data[0];
     26                 printf("%x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1),
     27                            *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
     28         }
     29         exit(0);
     30 }
swunk의 이미지

자답입니다.

위의 결과가 올바른 결과 인것 같습니다.

ioctl(fd, SIOCGARP, &arpreq);

시스템 콜을 호출하면 arpreq 안에는 시스템의 할당되어 있는 ip 주소값이 순서대로 들어가게 됩니다. (라인 18)
그래서 그 주소값을 key로 해서 arp hash 테이블을 검색하고 해당 키 값과 매칭되는 mac 주소를 arpreq 안에다가 넣어서 넘겨주면 해당 내용을 프린팅하게 되어 있더라구요..(라인 25~26)

리눅스 arp 테이블 안에는 당연히 자신의 시스템이 가지고 있는 ip 주소에 해당하는 엔트리는 없기 때문에 해당 mac 주소를 프린팅 하지 못하는 것 같습니다.

책에는 솔라리스에서 실행 시켰는데 솔라리스 arp table 캐쉬에는 아마도 자기 자신의 ip 주소와 이에 해당하는 mac 주소가 매핑되어 있을것 같습니다.

혹시 제가 잘못 이해했거나 위의 소스코드를 가지고 리눅스 에서 옳바른 결과를 출력하신 분 있으면 댓글 부탁드립니다.

wariua의 이미지

덤으로, arpreq.arp_dev 변수를 설정해 주는 걸 생략하셨습니다. ("man 7 arp"에 관련 내용이 있습니다.) 더불어, 만약을 생각해서 arpreq 변수 초기화도 시켜주신다면 더더욱 좋겠구요.

$PWD `date`

댓글 달기

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