在native层使用popen执行ping命令
来源:互联网 发布:宠物养成页游 源码 编辑:程序博客网 时间:2024/05/21 09:43
最近遇到一个问题,P2P中若长时间连接,source端进入锁屏。sink端长时间没有接收到数据,及同保活消息。这是sink端需要确认source端是保持着连接,还是已经断开了连接。想到一个方法,sink端去ping下source端的IP地址,根据source端的回应,确认source端的连接是否断开。
从网上搜索资料发现一种方法,popen函数可以在native层执行cmd。函数原型为“FILE *popen(const char *command, const char *type)”,popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
由此而知,我们使用ping命令,参数command可以为“ping -s 8 -c 5 192.168.0.101“。参数s表示要发送的报文(单位为字节)。参数c表示在收发指定的数目的报文后停止ping。注意此处为linux的ping命令,和window的ping命令参数是有区别的。现在为止,直接上代码
bool PingSourceIP(){
bool result = false;char strPingCmd[40] = "ping -s 8 -c 5 192.168.0.101";FILE *fp;char buf[200] = {0};char *pingResult = NULL;if((fp = popen(strPIngCmd, "r")) == NULL){
ALOGE("ping command error!");
}for(int i=0; i<10; i++){
if(fgets(buf, 200, fp) != NULL){
pingResult = strstr(buf, "16 bytes from");if(NULL != pingResult){
result = true;
}
}
}pclose(fp);return result;
}
此处需要注意两点:
1. popen函数返回的文件句柄fp,最后使用完后,要调用pclose(fp)进行关闭。
2. 从fp中读取数据,已经要把其中的数据读取完毕,否则将导致错误。这也就是为什么要循环读取十次的缘故。
资料参考:http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
0 0
- 在native层使用popen执行ping命令
- 使用popen函数创建ping命令管道
- Linux下使用popen()执行shell命令
- Linux下使用popen()执行shell命令
- Linux下使用popen()执行shell命令
- Linux下使用popen()执行shell命令
- Linux下使用popen()执行shell命令
- 使用popen函数执行shell命令
- Linux下使用popen()执行shell命令
- Linux下使用popen()执行shell命令
- linux使用popen读取shell命令执行结果
- 使用system,popen等执行命令函数失败的情况
- 使用popen()执行shell命令并获取内容
- 远程执行系统命令的服务器与popen的使用
- popen+pclose 执行 shell 命令
- C#执行dos里面的命令的方法,在Web中使用,比如ping,ipconfig等
- java执行ping命令
- 连续执行ping命令
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
- getting joins
- 解决Cloudera Clock Offset问题
- 图片加载问题
- mvn jetty:run出现OutOfMemoryError: PermGen space的处理
- 在native层使用popen执行ping命令
- Android开发笔记(五十)定时器AlarmManager
- swift if 条件判断语句
- maven 检查依赖冲突和版本冲突
- 堆和栈的区别,顺便介绍一下:全局区(静态区)、文字常量区、程序代码区
- Spring分布式事务- 三种实现方式(Spring+JTA)
- 彻底删除mysql-尤其是最后最后一步出现问题
- Android UI界面之FrameLayout(了解)
- Android Studio——Android Bitmap开发之旅--基本操作