Android设备被搜索之RawSocket
背景,初衷
1.需要完成一个设备搜索功能,及通过PC工具可以搜索到局域网中的设备
2.就算IP冲突也能搜索到设备
3.有Android系统源码可以进行系统开发条件。
Raw Socket
raw socket,就是原始套接字,可以接收本机网卡上的数据帧或者数据包,相比正常使用的socket来说,它更底层,数据更原始。
编译环境
在Android系统源码根目录下创建一个文件夹rawSocket,在其中新建两个文件,一个是rawSocket.c (源码),一个是Android.mk(编译脚本)。
想要编译代码,就需要编译mk文件。如下是我的配置:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
#编译后的模块名称
LOCAL_MODULE := rawSocket
#源码全称,有多少都要加上
LOCAL_SRC_FILES := rawSocket.c
LOCAL_MODULE_TAGS := optional
#此处是代码导入的必需包,用来获取系统版本等相关信息
LOCAL_STATIC_LIBRARIES :=libcutils
#编译成可执行文件
include $(BUILD_EXECUTABLE)
需要编译代码前,还需要建立编译环境,及在根目录下执行下面代码:
$ . build/envsetup.sh
然后切换到rawSocket目录下,输入 mm 即可进行模块编译,编译后的文件会生成到system/bin/路径下,名字就是LOCAL_MODULE对应名字。
RawSocket.c重点代码描述
建立raw socket服务
使用如下代码实现:
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
这里说明一下:
- 第一个参数使用 PF_PACKET 可以操作链路层的数据
- 第二个参数 SOCK_RAW,它表示是包含了MAC层头部信息的原始分组,当然这种类型的套接字在发送的时候需要自己加上一个MAC头部
- 第三个参数 htons(ETH_P_ALL) (ETH_P_ALL宏定义为0)时表示收发所有的协议
接收socket数据
使用如下代码实现:
#