webbench過程

參數 t c f p ? h v get option head trace

t表示時間 來設置請求時間
c表示併發數 來模擬多少個客戶端請求
f表示是否接受服務器端的數據 1表示接收
p表示設置代理
?和h表示顯示提示文檔
v表示顯示版本信息

下面用來設置請求方法

默認:
c=1
t=60
f=0 表示不接收服務器的返回
p=0 表示沒有使用代理

需要注意的一點是使用代理需要指出代理的地址

程序設計思想

首先是應該接受傳遞的參數 並根據參數來解析我們配置
編寫一個連接請求的函數 傳遞需要連接的主機名和端口 這個主機名可以是ip地址也可以是主機名,我們需要判斷這個傳遞的是
主機名還是ip地址,使用inet_addr來將host返回 如果返回 。。 則表示這不是一個ip地址串,需要進行將主機名轉換成
ip地址 gethostbyname,然後進行連接操作 返回一個連接成功的描述符
編寫一個主函數將傳遞的url傳入一個build_request函數中,在build_request函數中來構造一個request請求,request是一個全局變量,我們將http請求放入這個變量中,使用全局變量method和switch函數來判斷使用的是什麼請求方法
用strcat將請求方法放入其中,使用代理時可以直接將代理的網址放入request中,如果不使用代理需要自己構造請求頭
需要判斷用戶輸入測試的網站的網址的格式是否正確,判斷http://,判斷後面是否有請求頁面的路徑,因此需要後面是否有’/’
通常如果用戶測試的url中包含端口的話,需要知道端口號,因此我們需要從url中取出端口號,如果沒有的話使用默認的
port=80,再添加一些其他的請求頭,最後這個函數的作用便是組織請求。
接下來是bench函數這個函數的作用先連接一下指定的url,來判斷是否能夠連接成功,然後關閉,這個操作的作用便是
測試我們需要測試的網站是能夠訪問的,然後便是根據用戶指定的併發數進行穿件進程,如果有的進程穿件失敗便先睡眠
一秒,一直創建到用戶指定的進程數,根據返回值來判斷是子進程還是父進程,如果是子進程需要判斷是否使用代理,使用代理的話直接使用代理的host和port和request調用benchcore函數,否則使用目標host和port和request調用
benchcore函數,調用函數返回後然後再將相應的數據使用管道發送給父進程,當這個進程是父進程的話需要讀管道,這是一個while循環進行讀取的,
因爲有多個子進程,每讀取一個client的值減一,直到爲0表示所有的子進程都已經結束了,纔會將結果返回。
介紹benchcore函數,所有的向服務器的請求都是在這個函數中的,這個函數接收host和port和request,先使用host和port來創建一個連接,如果創建失敗failed加一,然後write請求,如果失敗
failed加一,接下來判斷force爲真時表示需要接收服務器端的數據,當read返回負數時關閉連接,進程重新連接並且failed加一,當read返回0時表示連接斷開,也是failed加一退出循環,這個
小循環的意思是防止連接斷開,當斷開時繼續在大循環裏執行進行重新連接,直到達到指定的時間纔會退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章