2009-10-15 44 views
3

有誰知道,如何在C++中捕獲ping的返回值?根據此link: ping應成功返回01發生故障,例如未知主機,非法數據包大小等等和2在無法訪問的主機或網絡上。如何在C++中捕獲ping的返回值

在C++中,我使用system()(例如, int ret = system("ping 192.168.1.5");

我的問題是,ret的值是01。它永遠不會2!如果我認爲正確,這是因爲,我得到的這個返回值是系統函數的返回值,而不是ping的。那麼我怎麼能得到ping的返回值?

在此先感謝!

kampi

編輯: 現在,我使用這個系統( 「平安192.169.1.5> ping_res.txt」);但我不想處理文件(打開,並閱讀它們),這就是爲什麼我想捕獲,如果可能的話返回值:)

回答

6

如果您使用的是Windows,它可能是更好地使用IcmpSendEcho2直接實現在應用程序中的ping功能。

1

一個簡單的解決方案將管道輸出ping到一個文件並閱讀它。

E.g.

system("ping 192.169.1.5 > ping_res.txt");

而且讀ping_res.txt得到你需要的信息。

+0

我現在使用這個「解決方案」,但它會更容易,獲得返回值,然後我不應該使用文件。這就是爲什麼,我想知道如何捕獲返回值:) – kampi 2009-10-15 05:17:38

1

man 3 system在Linux:

返回值
返回的值是1的錯誤(例如,叉(2)失敗),以及以其他方式命令的返回狀態。後者的返回狀態採用wait(2)中指定的格式。

然後從man 2 wait在Linux上:在INT

如果狀態不爲空,等待()和waitpid函數()存儲狀態信息,它指向。這個整數可以用下面的宏來檢查(它將整數本身作爲參數,而不是指向它的指針,就像在wait()和wait-pid()!中所做的那樣):

WIFEXITED(status)
如果孩子正常結束,即通過調用exit(3)或_exit(2)或從main()返回,則返回true。

WEXITSTATUS(狀態)
返回孩子的退出狀態。這包括子進程在調用exit(3)或_exit(2)時指定的status參數的最低有效8位或作爲main()中return語句的參數。僅當WIFEXITED返回true時才應使用此宏。

從SYS/wait.h在Linux上:

 
# define WEXITSTATUS(status) __WEXITSTATUS(__WAIT_INT(status)) 

從比特/ waitstatus。h在Linux上:

 
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */ 
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) 

換句話說,如果您使用的是Linux,您將會使用這些宏。您正在使用HP-UX嗎?我注意到您鏈接到HP-UX的信息。如果是這樣,你的man 3 system頁面說什麼?

另外,請記住,system調用「SH -c 命令」,您將收到SH的返回值:

退出狀態
應返回以下出口值:
0要執行的腳本完全由零個或多個空行或註釋組成,或兩者兼有。
1-125非交互式shell檢測到語法,重定向或變量賦值錯誤。
127非交互式shell無法找到指定的command_file。
否則,shell將返回它調用或嘗試調用的最後一個命令的退出狀態(另請參閱特殊內置實用程序中的退出實用程序)。

如果您嘗試輸入什麼樣的返回值,例如system("exit 203");

1

所以你只是想知道返回值:例如「0成功,失敗1例如未知主機,非法數據包大小等等,2在無法訪問的主機或網絡上」我認爲使用ping在這種情況下是一個矯枉過正的事情。寫入文件並從中讀取顯然有點難看。

我認爲你應該嘗試** open()**連接到端口7(Echo)上的主機。然後你會得到ping返回值會告訴你的信息。如果您還想獲得響應持續時間,您可以通過在回波端口上向主機發送任意數據來測量它。編寫代碼需要一些時間,但我認爲這是值得的靈活性和準確性。

相關問題