



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
原理其实很简单,那就是广播一个arp包,然后recv,如果没有数据(这里要设置延时),那么说明这个ip是可用的,否则就检测这个数据是否为回复我们发出的arp的应答包.如果是则证明ip已被使用,否则继续等待. 这里可以看下busybox的dhcp中的检测程序。 networking/udhcp/arpping.c C代码 1./* vi: set sw=4 ts=4: */ 2./* 3. * arpping.c 4. * 5. * Mostly stolen from: dhcpcd - DHCP client daemon 6. * by Yoichi Hariguchi 7. */ 8. 9.#include 10.#include 11. 12.#include common.h 13.#include dhcpd.h 14. 15./这里是arp包的格式,其中的数据格式都是宏了,比如uint_8_t为无符char. 16.struct arpMsg 17. /* Ethernet header */ 18. uint8_t h_dest6; /* 00 destination ether addr */ 19. uint8_t h_source6; /* 06 source ether addr */ 20. uint16_t h_proto; /* 0c packet type ID field */ 21. 22. /* ARP packet */ 23. uint16_t htype; /* 0e hardware type (must be ARPHRD_ETHER) */ 24. uint16_t ptype; /* 10 protocol type (must be ETH_P_IP) */ 25. uint8_t hlen; /* 12 hardware address length (must be 6) */ 26. uint8_t plen; /* 13 protocol address length (must be 4) */ 27. uint16_t operation; /* 14 ARP opcode */ 28. uint8_t sHaddr6; /* 16 senders hardware address */ 29. uint8_t sInaddr4; /* 1c senders IP address */ 30. uint8_t tHaddr6; /* 20 targets hardware address */ 31. uint8_t tInaddr4; /* 26 targets IP address */ 32. uint8_t pad18; /* 2a pad for min. ethernet payload (60 bytes) */ 33. PACKED; 34. 35.enum 36. ARP_MSG_SIZE = 0x2a 37.; 38. 39. 40./* Returns 1 if no reply received */ 41. 42./主程序,如果返回1说明此ip可用 43.int arpping(uint32_t test_ip, uint32_t from_ip, uint8_t *from_mac, const char *interface) 44. 45. 46. int timeout_ms; 47./这里使用poll来检测句柄。 48. struct pollfd pfd1; 49.#define s (pfd0.fd) /* socket */ 50. int rv = 1; /* no reply received yet */ 51. struct sockaddr addr; /* for interface name */ 52. struct arpMsg arp; 53. 54./建立scoket.由于我们是要直接访问访问链路层并自己组arp包.因此我们使用PF_PACKET协议簇.socket类型为SOCK_PACKET. 55. 56. s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP); 57. if (s = -1) 58. bb_perror_msg(bb_msg_can_not_create_raw_socket); 59. return -1; 60. 61. 62. if (setsockopt_broadcast(s) = -1) 63. bb_perror_msg(cannot enable bcast on raw socket); 64. goto ret; 65. 66./进行组包,由于是要广播,因此目的mac地址为全0. 67. /* send arp request */ 68. memset(&arp, 0, sizeof(arp); 69. memset(arp.h_dest, 0xff, 6); /* MAC DA */ 70. memcpy(arp.h_source, from_mac, 6); /* MAC SA */ 71. arp.h_proto = htons(ETH_P_ARP); /* protocol type (Ethernet) */ 72. arp.htype = htons(ARPHRD_ETHER); /* hardware type */ 73. arp.ptype = htons(ETH_P_IP); /* protocol type (ARP message) */ 74. arp.hlen = 6; /* hardware address length */ 75. arp.plen = 4; /* protocol address length */ 76. arp.operation = htons(ARPOP_REQUEST); /* ARP op code */ 77. memcpy(arp.sHaddr, from_mac, 6); /* source hardware address */ 78. memcpy(arp.sInaddr, &from_ip, sizeof(from_ip); /* source IP address */ 79. /* tHaddr is zero-fiiled */ /* target hardware address */ 80. memcpy(arp.tInaddr, &test_ip, sizeof(test_ip); /* target IP address */ 81. 82. memset(&addr, 0, sizeof(addr); 83. safe_strncpy(addr.sa_data, interface, sizeof(addr.sa_data); 84./广播arp包. 85. if (sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr) 0) 86. / TODO: error message? caller didnt expect us to fail, 87. / just returning 1 no reply received misleads it. 88. goto ret; 89. 90. 91. /* wait for arp reply, and check it */ 92./等待时间,超时则认为此ip地址可用 93. timeout_ms = 2000; 94. do 95. int r; 96. unsigned prevTime = monotonic_us(); 97. 98. pfd0.events = POLLIN; 99./这边他是害怕poll被信号打断,因此加了层循环,其实这边我们还可以使用ppoll的,就可以了。 100. r = safe_poll(pfd, 1, timeout_ms); 101. if (r 0) 102. break; 103. if (r) 104./读取返回数据. 105. r = read(s, &arp, sizeof(arp); 106. if (r = ARP_MSG_SIZE 110. & arp.operation = htons(ARPOP_REPLY) 111. /* dont check it: Linux doesnt return proper tHaddr (fixed in 2.6.24?) */ 112. /* & memcmp(arp.tHaddr, from_mac, 6) = 0 */ 113. & *(uint32_t *) arp.sInaddr) = test_ip 114. ) 115./说明ip地址已被使用 116. rv = 0; 117. break; 118. 119. 120. timeout_ms -= (unsigned)monotonic_us() - prevTime) / 1000; 121. while (timeout_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 1120:2025 EN Conveyor belts - Determination of strength of mechanical fastenings for textile conveyor belts- Static test method
- 商场安全员培训课件
- 2025年汽车行业智能网联技术发展前景研究报告
- 2025年可再生能源行业可再生能源发电技术及市场前景研究报告
- 2025年风电行业风能利用技术发展前景研究报告
- 2025年电信通讯行业5G技术应用前景研究报告
- 2025年区块链行业区块链数字资产交易市场前景研究报告
- 定海区2025年浙江舟山市定海区环境卫生管理中心编外招聘2人笔试历年参考题库附带答案详解
- 大足区2025重庆大足区某机关事业单位招聘2人笔试历年参考题库附带答案详解
- 商品食品安全培训资料课件
- 离子检验-教案-
- GB/T 12643-2025机器人词汇
- Unit 5 Lesson 20 The Spring Festival Is Coming!(说课稿)-2024-2025学年冀教版(三起)英语五年级上册
- 智能悬架系统集成开发关键技术与实践-2024-12-技术资料
- 应用PDCA降低药占比
- 分包商安全管理规定(4篇)
- 超重与失重+说课高一上学期物理人教版(2019)必修第一册
- 公司收取管理费协议书范本
- JTS-165-6-2008滚装码头设计规范-PDF解密
- 设备维修与保养(课件)
- 医院培训课件:《和谐医患关系的建构与医疗纠纷的应对》
评论
0/150
提交评论