客戶端Ping伺服器工具[Python]

yinchuan發表於2013-07-19

要寫一個方便使用的客戶端ping伺服器的小工具,記錄一下關鍵的地方。這裡使用Python的subprocess模組呼叫系統命令ping.exe,利用正規表示式從輸出結果中提取需要的資訊。subprocess模組可以和開啟的子程式進行資料傳遞,非常方便。

這裡要注意的是,子程式要使用絕對路徑,不然在用py2exe打包後,會找不到可執行檔案。

COUNT  = ‘10’
TIMEOUT = ‘6’
PING_EXE = 'C:\Windows\System32\PING.EXE'
SEP = os.linesep
p = subprocess.Popen(
    [ PING_EXE, server, '-n', COUNT, '-w', TIMEOUT],
    stderr=file('nul', 'a'), 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE)
data = p.stdout.read().split(SEP)
data = data[-5:-1]

data中儲存ping.exe輸出的內容,和在cmd.exe裡使用ping時的輸出內容一樣,最後幾行包含了此次ping的彙總資訊。輸出的結果是str型別,用換行符來截斷成list,根據最後4行來判斷ping的結果。應該會有更好的方法,先這樣用了。Windows下ping的結果有3種:

  1. 正常ping通,最後4行都不為空。
  2. 無法解析DNS,即unknow host。輸出行數為1,len(data) == 1
  3. 能解析,但ping不通,即100%丟包,此時輸出中沒有delay資訊。

用來提取資料的正規表示式:

# 域名解析後的IP地址
# 輸入:115.239.210.27 的 Ping 統計資訊:
# 結果:['115.239.210.27']
re_ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*')

# 資料包的收發統計
# 輸入:資料包: 已傳送 = 10,已接收 = 10,丟失 = 0 (0% 丟失)
# 結果:[('10', '10', '0', '0%')]
re_packets = re.compile('.*= ([0-9]+).*= ([0-9]+).*= ([0-9]+).*\(([0-9]+%).*')

# 資料包delay資料
# 輸入:最短 = 5ms,最長 = 44ms,平均 = 9ms
# 結果:[('5', '44', '9')]
re_delay = re.compile('.*= ([0-9]+)ms.*= ([0-9]+)ms.*= ([0-9]+)ms')

更好的方法是使用基於web的工具,測試者只需要開啟對應網頁,就可以從測試者的機器上ping伺服器。在不安裝多餘外掛的前提下,就只有JS和ActionScript可以選擇了。JavaScript是不能直接傳送ICMP包的,只有採用變通的辦法測試。目前線上測網速的工作大都是使用Flash實現。

相關文章