国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測)

2020-01-26 13:29:18
字體:
來源:轉載
供稿:網友

遇到一個小需求, 快速搞定。 來看看用C/C++代碼檢測ip能否ping通:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>using namespace std;string getCmdResult(const string &strCmd) // 這個是獲取命令執行的結果, 類似于system, 之前我已經說過了{   char buf[10240] = {0};   FILE *pf = NULL;   if( (pf = popen(strCmd.c_str(), "r")) == NULL )   {     return "";   }   string strResult;   while(fgets(buf, sizeof buf, pf))   {     strResult += buf;   }   pclose(pf);   unsigned int iSize = strResult.size();   if(iSize > 0 && strResult[iSize - 1] == '/n') // linux   {     strResult = strResult.substr(0, iSize - 1);   }   return strResult; } int main(int argc, char *argv[]){ if(argc != 2) { cout << "no" << endl; return -1; } string strCmd = "ping " + string(argv[1]) + " -w 1"; string strRe = getCmdResult(strCmd); if(strRe.find("received") != string::npos && strRe.find(", 0 received") == string::npos) { cout << "ipok:" + string(argv[1]) << endl; } else { cout << argv[1] << endl; } return 0;}

測試一下:

ubuntu@VM-0-13-ubuntu:~$ ./a.out noubuntu@VM-0-13-ubuntu:~$ ./a.out 1.1.1.11.1.1.1ubuntu@VM-0-13-ubuntu:~$ ./a.out 172.16.0.13ipok:172.16.0.13ubuntu@VM-0-13-ubuntu:~$ ./a.out www.baidu.comipok:www.baidu.comubuntu@VM-0-13-ubuntu:~$ 

如上ping測試的超時時間是1s, 自己可以改。  另外, 如果有a.txt文件, 每行一個ip, 怎么知道哪些ip能否ping通呢? awk和system搞起吧, 我們已經說過了:

ubuntu@VM-0-13-ubuntu:~$ cat a.txt
1.1.1.1
www.baidu.com
www.qq.com
ubuntu@VM-0-13-ubuntu:~$
ubuntu@VM-0-13-ubuntu:~$
ubuntu@VM-0-13-ubuntu:~$
ubuntu@VM-0-13-ubuntu:~$ awk '{cmd="./a.out " $1; system(cmd)}' a.txt
1.1.1.1
ipok:www.baidu.com
ipok:www.qq.com
ubuntu@VM-0-13-ubuntu:~$

可見 1.1.1.1 ping不通, 其余的可以ping通。

上面用awk和system有個問題:如果ip過多, 則必須等到所有ip檢測完畢后, 才知道最后的結果。 也就是說, 并不是處理完一個ip后, 就立即能看到結果的。怎么辦呢?可以寫程序逐行讀取文件來搞起, 看下:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fstream>#include <string>using namespace std;string getCmdResult(const string &strCmd) {   char buf[10240] = {0};   FILE *pf = NULL;   if( (pf = popen(strCmd.c_str(), "r")) == NULL )   {     return "";   }   string strResult;   while(fgets(buf, sizeof buf, pf))   {     strResult += buf;   }   pclose(pf);   unsigned int iSize = strResult.size();   if(iSize > 0 && strResult[iSize - 1] == '/n') // linux   {     strResult = strResult.substr(0, iSize - 1);   }   return strResult; } string ipCheck(const string &ip){ string strCmd = "ping " + ip + " -w 1"; string strRe = getCmdResult(strCmd); if((strRe.find("received") != string::npos && strRe.find(", 0 received") == string::npos)) { return "ipok:" + string(ip); } else { return ip; }}int main(int argc, char *argv[])  // ./a.out a.txt b.txt{ if(argc != 3) { cout << "error" << endl; return -1; } string strCmd = "rm -rf " + string(argv[2]); system(strCmd.c_str()); strCmd = "wc -l " + string(argv[1]) + "| awk '{print $1}'"; // 獲取文件行數 string strNumLine = getCmdResult(strCmd); ifstream in(argv[1]); string filename; string line; unsigned int i = 0; if(in) // 有該文件 { while (getline (in, line)) // line中不包括每行的換行符 {  // 這里最好做ip格式判斷  string strResult = ipCheck(line);  strCmd = "echo " + strResult + " >> " + string(argv[2]) ;  cout << strCmd << endl;  system(strCmd.c_str()); } } else // 沒有該文件 { cout <<"no such file" << endl; } return 0;}

看下結果:

ubuntu@VM-0-13-ubuntu:~/tmp_test$ ls
a.txt  test.cpp
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$ cat a.txt
1.1.1.1
2.2.2.2
www.baidu.com
3.3.3.3
4.4.4.4
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$ g++ test.cpp
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$ ./a.out a.txt b.txt
echo 1.1.1.1 >> b.txt
echo 2.2.2.2 >> b.txt
echo ipok:www.baidu.com >> b.txt
echo 3.3.3.3 >> b.txt
echo 4.4.4.4 >> b.txt
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$
ubuntu@VM-0-13-ubuntu:~/tmp_test$ cat b.txt
1.1.1.1
2.2.2.2
ipok:www.baidu.com
3.3.3.3
4.4.4.4
ubuntu@VM-0-13-ubuntu:~/tmp_test$

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巩留县| 定兴县| 萍乡市| 罗山县| 甘肃省| 会泽县| 江口县| 万源市| 古丈县| 卢湾区| 正定县| 长武县| 沁水县| 广安市| 米林县| 高碑店市| 富裕县| 贡觉县| 焦作市| 新昌县| 平陆县| 永吉县| 金坛市| 宁强县| 平江县| 建平县| 田东县| 邯郸市| 云阳县| 霍邱县| 临沭县| 滦平县| 嵊州市| 永康市| 潞城市| 莱西市| 石景山区| 辽阳市| 天柱县| 花垣县| 高邮市|