在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
原创粉丝点击