簡體   English   中英

如何在C ++中捕獲ping的返回值

[英]How to capture ping's return value in C++

有誰知道,如何在c ++中捕獲ping的返回值? 根據此鏈接 :ping應成功返回0 ,失敗時返回1 ,例如未知主機,非法數據包大小等2在無法訪問的主機或網絡上。

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

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

提前致謝!

kampi

編輯:現在我使用這個系統(“ping 192.169.1.5> ping_res.txt”); 但我不想使用文件(打開,並閱讀它們),這就是為什么我要捕獲,返回值,如果可能的話:)

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

一個簡單的解決方案是將ping的輸出傳遞給文件並讀取它。

例如

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

並閱讀ping_res.txt以獲取所需的信息。

從Linux上的man 3 system

返回值
錯誤時返回的值為-1(例如fork(2)失敗),否則返回命令的返回狀態。 后一種返回狀態采用wait(2)中指定的格式。

然后從man 2 wait Linux:

如果status不是NULL,則wait()和waitpid()將狀態信息存儲在它指向的int中。 可以使用以下宏檢查此整數(將整數本身作為參數,而不是指向它的指針,就像在wait()和wait-pid()中一樣!):

WIFEXITED(狀態)
如果子節點正常終止,即通過調用exit(3)或_exit(2),或從main()返回,則返回true。

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

來自Linux上的sys / wait.h:

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

來自Linux上的bits / waitstatus.h:

/* 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 command ”,您將收到sh的返回值:

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

如果你嘗試,你會發現什么回報值,例如, system("exit 203");

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM