亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5078 | 回復(fù): 9
打印 上一主題 下一主題

關(guān)于用ioctl()獲取硬件地址問(wèn)題! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-10-13 19:24 |只看該作者 |倒序?yàn)g覽

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <net/if.h>
  5. #include <net/if_arp.h>
  6. #include <sys/ioctl.h>
  7. #include <netinet/in.h>

  8. void err_sys(const char *errmsg);

  9. int main(void)
  10. {               
  11.         int i, sockfd;
  12.         struct ifreq ifr;
  13.         struct arpreq arpr;
  14.        
  15.         strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
  16.        
  17.         if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
  18.                 err_sys("socket");       
  19.        
  20.         /* get ip address */
  21.         if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1)       
  22.                 err_sys("1-ioctl");
  23.        
  24.         /* get hardware address */
  25.         memcpy(&arpr.arp_pa, &ifr.ifr_addr, sizeof(struct arpreq));
  26.         if (ioctl(sockfd, SIOCGARP, &arpr) == -1)
  27.                 err_sys("2-ioctl");
  28.        
  29.         /* output hardware address */
  30.         for (i = 0; i < 6; i++) {
  31.                 printf("%x", arpr.arp_ha.sa_data[i]);
  32.                 if (i != 5)
  33.                         printf("%c", ':');
  34.         }

  35.         exit(0);
  36. }

  37. void err_sys(const char *errmsg)
  38. {
  39.         perror(errmsg);
  40.        
  41.         exit(1);
  42. }
復(fù)制代碼


我的思想是先取IP,然后取硬件地址,怎么出錯(cuò)呢?
錯(cuò)誤: 2-ioctl: No such device

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-10-13 19:25 |只看該作者
ip可以取到

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-10-13 19:30 |只看該作者
系統(tǒng)是:Redhat

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-10-13 19:32 |只看該作者
第二個(gè)ioctl, "eth0"沒(méi)有傳進(jìn)去,只傳了一個(gè)ip是沒(méi)用的。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-10-13 19:38 |只看該作者
老大,"eth0"怎么能傳進(jìn)arpr結(jié)構(gòu)啊

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-10-13 19:46 |只看該作者
我用arp -a列出的:
[root@localhost xuzhengyang]# /sbin/arp -a
? (192.168.1.1) at 00:0A:EB:BA:7D:E4 [ether] on eth0

但是我的程序輸出的 eto0的IP是"192.168.1.5"啊,和這個(gè)有關(guān)系吧

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-10-13 19:46 |只看該作者

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <net/if.h>
  5. #include <net/if_arp.h>
  6. #include <sys/ioctl.h>
  7. #include <netinet/in.h>

  8. void err_sys(const char *errmsg);

  9. int main(void)
  10. {               
  11.         int i, sockfd;
  12.         struct ifreq ifr;
  13.         struct arpreq arpr;
  14.       
  15.         strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
  16.       
  17.         if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
  18.                 err_sys("socket");      
  19.       
  20.         /* get ip address */
  21.         if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1)      
  22.                 err_sys("1-ioctl");
  23.       
  24.         /* get hardware address */
  25.                 ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
  26.         if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
  27.                 err_sys("2-ioctl");
  28.       
  29.         /* output hardware address */
  30.         for (i = 0; i < 6; i++) {
  31.                         unsigned char *mac = (unsigned char *) ifr.ifr_hwaddr.sa_data;
  32.                 printf("%x", (int) mac[i]);
  33.                 if (i != 5)
  34.                         printf("%c", ':');
  35.         }

  36.         exit(0);
  37. }

  38. void err_sys(const char *errmsg)
  39. {
  40.         perror(errmsg);
  41.       
  42.         exit(1);
  43. }

復(fù)制代碼

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-10-13 19:48 |只看該作者
太謝謝這位老大了,太謝謝了,再謝

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-10-13 19:51 |只看該作者
原帖由 skai 于 2006-10-13 19:48 發(fā)表
太謝謝這位老大了,太謝謝了,再謝


不用那么客氣,正好我手頭有段類似的代碼

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
10 [報(bào)告]
發(fā)表于 2006-10-13 20:00 |只看該作者
struct net_device *dev = dev_get_by_name( "eth0" );
然后取 dev->dev_addr

不公平啊。
kernel 里獲取這些信息那么方便,我們這些用戶層的程序員好辛苦哦~
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP