用C/C++程式碼檢測ip能否ping通(配合awk和system可以做到批量檢測)
遇到一個小需求, 快速搞定。 來看看用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
no
ubuntu@VM-0-13-ubuntu:~$ ./a.out 1.1.1.1
1.1.1.1
ubuntu@VM-0-13-ubuntu:~$ ./a.out 172.16.0.13
ipok:172.16.0.13
ubuntu@VM-0-13-ubuntu:~$ ./a.out www.baidu.com
ipok:www.baidu.com
ubuntu@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$
相關文章
- 用ping檢測網段ip的佔用情況
- C/C++程式除錯和記憶體檢測C++除錯記憶體
- shell指令碼和python指令碼實現批量ping IP測試指令碼Python
- php批量檢測並去除BOM頭的程式碼PHP
- 景區如何限流?竟然可以用人臉檢測做到
- C++ 程式記憶體洩漏檢測方法C++記憶體
- c++ vector容器——檢測更改容量和大小 示例C++
- 用C++ Builder檢測Windows的啟動模式(轉)C++UIWindows模式
- 通過持續Ping來檢測網路質量
- windows 檢測某ip的埠是否可以訪問Windows
- C++檢測異常assert()函式C++函式
- C/C++記憶體洩漏及檢測C++記憶體
- shell檢測ip衝突
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 微信域名檢測批次檢測api介面分享(附上html程式碼)APIHTML
- 用ping命令檢測電腦不能上網的故障
- php程式碼檢測工具使用PHP
- GUI成績檢測程式碼GUI
- javascript矩形碰撞檢測程式碼JavaScript
- 目標檢測:二維碼檢測方案
- [原創]發一個批量檢測xcode ghost病毒的檢測工具XCode
- 微信域名檢測 微信域名檢測官方介面的呼叫程式碼分享
- Windows系統錯誤程式碼-----故障檢測用Windows
- 批次檢測主機IP(一)
- Goalng使用ping命令檢測網路是否連通,分析網路故障Go
- 實用的檢測解析度的程式程式碼 (轉)
- 檢測橫屏豎屏程式碼
- 【Sonar程式碼質量檢測工具】
- java靜態程式碼檢測-pmdJava
- 建材用石硬度檢測,碎石壓碎值檢測
- 5 款阿里常用程式碼檢測工具,免費用!阿里
- 代理IP檢測的三種方法
- Linux檢測IP合法性Linux
- 網站可以檢測到代理嗎?網站
- 實用爬蟲-01-檢測爬蟲的 IP爬蟲
- 檢測代理IP是否被佔用的三種方法
- JavaScript 使用者代理檢測(瀏覽器型別檢測,執行平臺檢測等) 規範程式碼JavaScript瀏覽器型別
- 目標檢測實用中可以改進的方向