2 qq 29791809 qq_29791809 于 2016.04.22 19:47 提问

Android NDK如何获取原始套接字(Raw Socket)

这是我在学校的本科毕业设计。是要在安卓手机上实现Traceroute功能。我编写了C语言的tracetoute程序,已经在Linux平台上正确运行了,但是移植到Android平台上的时候,总是无法获取到原始套接字啊,int sockId = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP),sockid总是小于0。我的手机已经获取root权限了(su chmod777+一个刷过的安卓手机)。求助啊啊啊,已经卡在这好久了

1个回答

zuishikonghuan
zuishikonghuan   2016.04.22 23:41

1。必须用root用户运行,getuid()是0吗?
2。参考busybox源码,busybox里有这个,亲测Android上可用。
3。实在不行,你就别用ndk了,用arm-linux-gcc并静态链接glibc试试吧。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Windows下通过使用RAW原始套接字进行抓包
// 注意:原始套接字只在系统管理员权限下起作用,其它情况下socket创建失败,所以开发时首先以管理员权限启动VS SOCKET nAnniSock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);  // 指定为原始套接字(IP层抓取) // 设置IP_HDRINCL选项,以便自己构造(解析)IP头部 BOOL bRaw = TRUE;
原始套接字(raw socket)
1.原始套接字(raw socket)   1.1 原始套接字工作原理与规则          原始套接字是一个特殊的套接字类型,它的创建方式跟TCP/UDP创建方法几乎是 一摸一样,例如,通过 CODE: [Copy to clipboard]        int sockfd;        sockfd = socktet(AF_INET, SOCK_
Linux C raw_socket (原始套接字)
我们平常所用到的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据。收到的数据往往只包括应用层数据。某些情况下我们需要执行更底层的操作,比如监听所有本机收发的数据、修改报头等。 通过原始套接字,我们可以抓取所有发送到本机的IP包(包括IP头和TCP/UDP/ICMP包头),也可以抓取所有本机收到的帧(包括数据链路层协议头)。普通的套接字无法
raw_socket(原始套接字)以及普通socket使用终极总结
一、传输层socket(四层socket,普通socket) 可参考本人以下博客: Windows Socket编程之UDP实现大文件的传输:http://blog.csdn.net/luchengtao11/article/details/71016222 Windows Socket编程之TCP实现大文件的传输:http://blog.csdn.net/luchengtao11/arti
网络编程原始套接字SOCKET_RAW
SOCKET_STREAM 流式套接字      SOCKET_DGRAM        SOCKET_RAW 原始套接字    IPPROTO_IP IP协议    IPPROTO_ICMP INTERNET控制消息协议,配合原始套接字可以实现ping的功能    IPPROTO_IGMP INTERNET 网关服务协议,在多播中用到 在AF_INET地址族下
基于原始套接字(raw socket)的网络抓包工具
基于raw socket的网络抓包工具 1. 原始套接字(raw socket)简介 原始套接字可以接收本机网卡上的数据帧或者数据包,利用raw socket可以编写基于IP协议的程序。一般的TCP/UDP类型的套接字只能够访问传输层以及传输层以上的数据,而原始套接字却可以访问传输层一下的数据,所以使用raw socket既可以实现应用层的数据操作,也可以实现链路层的数据操作。
Linux下使用RAW SOCKET原始套接字构造UDP原始数据帧广播到局域网,在局域网的另一台计算机上显示UDP发送的信息
因为使用IEC61850需要直接访问以太网数据链路层
基于socket原始套接字的网络嗅探器
// NetSniffer.cpp : 定义控制台应用程序的入口点。 // /* 简单说明一下什么是网络嗅探器,网络嗅探器是一个抓取所有经过网卡数据的软件,在一般使用电脑时,网卡 只接受到发送至本机的数据,那是因为这是网卡是非混杂模式的,挡一个目的地址非本机地址的数据包经过网 卡时,网卡在数据链路层(mac地址)检测到是非本机数据,则直接丢弃,当设置为混杂模式时,所有经过网卡 的数据包均可被读取出
Unix Socket --- 原始套接字(Raw Socket)
Unix Socket
Linux下使用原始套接字实现ping命令
客户端程通过透明代理访问远程服务器,代理需要以SNAT去修改源地址源端口,一般写法是Add SNAT、Connect、Del SNAT; 那么问题来了,加SNAT规则时需要 -s $ip --sport $port (避免多个客户端互相混淆),若正好代理机器上存在多个地址时,调用Connect之前Socket并不知道需要绑定哪个出口地址,那怎么获取到$ip、$port呢? 思路是需要在Connect动作之前,目的服务器地址是已知的,通过发送ICMP echo 来确定本机的出口地址;