小問題有大智慧-Proxy 伺服器的監測

來源:互聯網
上載者:User

最初發表在QQ空間中,全文參見 小問題有大智慧-Proxy 伺服器的監測

公司裡的電腦都在一個域內,上網使用PAC自動化指令碼,內部會自動解析所需要的代理,這些都是網路系統管理員自動化佈建,用今天流行語來說,你設定了。有的時候這挺煩人的,特別是當你需要自己設定代理時,雖然當時你可以在瀏覽器的選項裡這麼做,不過一會兒,又會被域Policy自動更改回來。有沒有方法可以讓你自己設定呢?

做開發的一個好處這個時候體現出來,你可以自由的做你需要的東西,只要你不懶。

正好以前做過類似BHO的東西,第一時間,我最直觀的想法就是做個BHO,監測代理設定,發現被修改了就再改回來。想到就做,而且確實也簡單,使用ATL做了BHO外掛程式,只要實現一個介面,

STDMETHOD(SetSite)(IUnknown *pUnkSite);

瀏覽器啟動的時候自動載入BHO,調用SetSite介面。SetSite裡建立了一個線程,監聽代理設定,如果有改動,再改回來。大概100行代碼不到

測試下,功能上沒有問題,有問題的是BHO的機制,BHO會在瀏覽器啟動時載入,但並不是進程綁定的。在IE7,IE8以及後續版本中,由於多個Tab,每開個Tab,就會載入一個BHO對象,關閉Tab時BHO也會關閉。這樣開啟多個Tab時會啟動多個線程做同樣的一件事情,低效而且危險。怎麼辦?

一開始想的Solution是對象計數,在BHO裡添加了對象計數功能,只在第一個BHO對象裡建立背景工作執行緒,後續建立的其它對象什麼都不做,這樣可不可以?很快被自己否決了,IE8是多進程模型,每個TAB是個進程,對象計數不能跨進程工作。另一個Solution隨之出來,並不需要對象計數,使用一個進程間共用的變數來標記代理背景工作執行緒的存在。

代碼如下:

#pragma data_seg( "Share" )volatile LONG proxyInstances = 0;#pragma data_seg( )

下面是DEF檔案,

SECTIONS Share READ WRITE SHARED

proxyInstances 這個變數是進程間共用,BHO啟動時檢測這個標記,如果是FALSE,建立代理背景工作執行緒,將它設定為TRUE; 否則什麼都不用做。建立代理線程的BHO退出時,終止線程,並清除標記。

測試了這個實現,總體上比較滿意,最多隻會有一個線程在工作,輕量而且效率高。請注意最多2個字,這個方案有明顯的一個缺陷,第2天我才想到,假設碰巧關閉了建立背景工作執行緒的Tab,BHO裡雖然會設定標記成FALSE,但背景工作執行緒也會關閉。這個時候的遊覽器是失去監測的,直到使用者新開Tab。

仔細考慮之後,想了2個方案:

1. 把這個功能做在service裡,單獨運行,與遊覽器無關。

這個方案理論上可行,並且不用考慮遊覽器生命週期的問題,實現簡單。但很多使用者包括我並不喜歡自己的系統裡安裝上一大堆莫名其妙的進程啊,Service什麼的。我更想的是那種on demand的方式,因此,放棄它。

2. 還是BHO實現,不要進程間共用變數,而是建立一個命名的核心對象Event,每個BHO都會建立背景工作執行緒,去Wait這個Event,獲得Event的線程就進入工作狀態,當這個BHO退出的時候,調用SetEvent去通知其它正在Wait的線程。

這個方案是on demand方式的,遊覽器開啟即開始工作。缺點是會建立多個線程(取決於使用者開啟Tab的數量),雖然某個時刻只有一個線程在工作狀態,其它的線程都在Wait。但線程本身也是一種消耗。

仔細想想原來的那種進程間共用變數的方案,確實有明顯的缺陷,但真的不能用嘛?公司域Policy更新的時間並不頻繁,假設1小時一次,那麼會有多大的可能我恰好關閉了那個Tab(擁有背景工作執行緒的)之後,1小時之內不去開新Tab?我的習慣是什嗎?想通了這點,答案豁然開朗。目前的方案應該完全可行。隨後2周的使用,也證實了這點。正象Rework一書所說的,剛剛好就是真的好

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.