第一篇:Web服務器處理404錯誤取決于網(wǎng)絡管理員
Web服務器處理404錯誤取決于網(wǎng)絡管理員
每一個互聯(lián)網(wǎng)用戶都會在某個地方碰到“404——無法找到文件”的錯誤頁面?;蛟S在非正式微軟版本上會顯示:“該頁無法顯示?!被蛘邽g覽器顯示錯誤為:“頁面錯誤?!辈⒎敲總€網(wǎng)站都以相同的方式公布錯誤。試著輸入一個錯誤的URL(如,刪除后面的.com并鍵入一串亂碼)并查看網(wǎng)站的錯誤說明有何不同。
錯誤404是最為常見的一組標準化可配置HTTP協(xié)議錯誤,定位在400到505之間。當這些錯誤得到標準化時,Web服務器處理404錯誤的方法最終就取決于網(wǎng)絡管理員。這就是為什么將其稱之為“可配置”。最為通用的Web服務器軟件,Apache,通過位于public_html目錄下的小文本文件.htaccess來控制HTTP錯誤的處理方法。重定向語法非常簡單:“ErrorDocument [error code] [url]”。允許錯誤代碼的URL能夠指向任意一個具有有效地址的網(wǎng)站。通常,它指向一個工作目錄中的自定義頁面,如“404error.html”。
但是,如果你將URL指向主頁地址(尤其是index.html),那么一個錯誤地址會將用戶返回到站點的主頁。這是Ipswitch.com的設置:“ErrorDocument 404 /index.html”。
自行設置
將修改.htaccess文件的說明應用到Apache服務器中。微軟IIS服務器的缺省錯誤頁面能夠通過在互聯(lián)網(wǎng)信息服務中選擇網(wǎng)站目錄進行修改,單擊屬性、選擇自定義錯誤屬性頁面,根據(jù)自己的需要選擇錯誤信息,然后編輯已修改文件的路徑。無論在什么情況下,網(wǎng)絡管理員
都能夠為你提供修改404錯誤頁面所需的詳細信息。
如果你正在尋求更多超出常規(guī)的方法,將整個站點致力于創(chuàng)造出具有創(chuàng)新性的404錯誤頁面。那么訪問“404研究實驗室”是明智的選擇。這些日子幾乎所有人都成了網(wǎng)管。Web環(huán)境格外廉價并且具有很多優(yōu)秀的Web開發(fā)工具。但是即使你正確配置了404錯誤頁面,有時候IE也無法將其正確顯示。而是顯示站點指定的頁面,IE選擇顯示自己缺省的404錯誤消息?!霸擁摕o法找到”錯誤實際上是由Internet Explorer生成的,而非Web服務器。微軟的論調(diào)就在于缺省的HTTP錯誤消息是正確的,但用處并非很大。缺省的HTTP錯誤消息總是顯示:404無法找到,在該服務器上無法找到請求的URL。其它的什么也沒有。沒有重定向,沒有其它提示信息。盡管微軟版需要閱讀一個合法文件,但其中的信息更為有效。
滿足極限值
Internet Explorer顯示的缺省404錯誤頁面依賴于Web用戶控制的兩個變量。第一個,可以通過進入Internet選項并選擇高級標簽,向下拖動滾動條到“顯示友好HTTP錯誤消息”,取消復選框的選中狀態(tài),可以禁用此項功能。未被選中的復選框?qū)⑨尫旁嫉腍TTP消息。但是,作為一個網(wǎng)頁設計者,你不能假設用戶已經(jīng)取消了這個選項;同時,作為一個Internet Explorer用戶,你也不能就認為網(wǎng)頁設計者已經(jīng)設計了友好的用戶信息。
第二個關鍵變量是錯誤頁面自身的大小,以字節(jié)為單位。Windows注冊表中的鍵值就是,HKEY_LOCAL_MACHINESoftwareMicrosoftInternet
ExplorerMainErrorThresholds,將404錯誤頁面大小的極限值設置為512字節(jié)。如果該網(wǎng)站的404錯誤頁面超出512字節(jié),那么Internet Explorer將顯示此錯誤頁面;如果未超出范圍,那么就使用自身的錯誤頁面。
眾所周知,個人網(wǎng)站是互聯(lián)網(wǎng)絡的基礎和驅(qū)動力,在一定程度上影響和代表了互聯(lián)網(wǎng)絡的發(fā)展。據(jù)記者了解,截止2005年底中國個人網(wǎng)站數(shù)量已接近3000萬,并且發(fā)展速度十分迅猛,可以說個人網(wǎng)站已發(fā)展成為中國網(wǎng)絡媒體一個重要的補充力量。只要發(fā)展穩(wěn)定,個人網(wǎng)站今后仍會持續(xù)快速增長。未來,個人網(wǎng)站仍是互聯(lián)網(wǎng)發(fā)展的一個趨勢。
與此同時,一些專家紛紛表示,個人網(wǎng)站的崛起將直接影響到虛擬主機市場。目前虛擬主機已成為最主要的建站平臺,個人網(wǎng)站的建設首先要選擇一個穩(wěn)定、優(yōu)質(zhì),適合于自己的虛擬主機?,F(xiàn)階段國內(nèi)虛擬主機服務提供商眾多,產(chǎn)品也良莠不齊,但一直是以商務專用型虛擬主機為主,而針對個人建站的入門型虛擬主機卻并不多見,另外,目前市場上的虛擬空間容量一般都固定在100M、250M、500M、3G等這些上面,限制了用戶尤其是個人建站用戶對不同容量的個性化需求,這一切都與個人網(wǎng)站的需求和發(fā)展不相適應。
據(jù)記者了解,在國內(nèi)市場上有一部分虛擬主機服務商已經(jīng)意識到市場的需求,相繼推出適合個人建站的虛擬主機,如榮獲2005年度注冊服務機構(gòu)最佳進取獎的時代互聯(lián)就于國內(nèi)率先推出了自由定制王牌
虛擬主機,實現(xiàn)空間容量自由定制,類型任選,此外,購主機贈送GCDN網(wǎng)絡鏡像加速引擎,從而更好的解決了南北互通問題。尤其是強勢推出的入門學習型50M虛擬主機(僅6元/月),更是針對個人和企業(yè)用戶量身定做,真正滿足個人和企業(yè)建站的實際需求。
本文出自:定制地板轉(zhuǎn)載請注明出處
第二篇:網(wǎng)絡管理員常見錯誤集錦
協(xié)議分析器是網(wǎng)絡管理員庫中最強有力的工具之一。它能將難處理、耗時長、讓CEO們感到惱火甚至不得不重啟所有機器的問題轉(zhuǎn)變?yōu)槟芏虝r處理、易于在每周例行狀態(tài)報告中反映的問題,為公司省下大量的時間與金錢。
然而,就像其它任何復雜工具一樣,它必須被適當運用才能獲得最大的效益。在使用協(xié)議分析器診斷網(wǎng)絡故障時,應當盡量避免……
錯誤1 分析器誤置
正確放置分析器對快速診斷故障具有決定性作用。設想分析器是置于網(wǎng)絡中的窗口,猶如建筑物窗口一般,視野的改變依賴于從哪個窗口看出去。從南面窗口望去是看不到建筑物北面高速公路上交通的擁擠狀況的。在分析置于網(wǎng)絡不當位置的分析器時,跟蹤往往要花很長時間。那么,怎樣正確放置分析器呢?我們可以舉例說明。
以下為幾個可能出現(xiàn)的問題及原因分析:
設想A:一臺主機,服務器A,主機不能與其它任何主機通信??赡艿脑颍?/p>
1)服務器A沒有正確配置;
2)服務器A配置的網(wǎng)卡出錯;
3)服務器A所在局域網(wǎng)出了問題;
4)服務器A所在局域網(wǎng)段出錯。
設想B:一臺主機,服務器B,主機不能與遠程網(wǎng)X中的任何一臺主機通信;且局域網(wǎng)或其它遠程網(wǎng)中的主機無任何故障(這就意味著問題不可能出現(xiàn)在服務器B或服務器B所在局域網(wǎng)段上)。
可能原因:
1)服務器B有關網(wǎng)絡X的部分配置錯誤;
2)3)4)5)服務器B用于連接到網(wǎng)絡X的路由器所在網(wǎng)段的連接出了問題;服務器B所在局域網(wǎng)與網(wǎng)絡X的一處或多處鏈接出了問題;網(wǎng)絡X用于連接到服務器B所在網(wǎng)絡的路由器所在網(wǎng)段出了問題;網(wǎng)絡X出了問題。
設想C:一臺主機,服務器C,主機不能與局域網(wǎng)中另一主機通信,但與網(wǎng)絡中其它主機通信正常(這意味著問題不可能出現(xiàn)在服務器C或服務器C所在局域網(wǎng)段)。可能的原因:
1)主機C錯誤配置;
2)主機C網(wǎng)卡出現(xiàn)故障;
3)主機C所在局域網(wǎng)段出了問題。
設想D:一臺主機,服務器D,主機不能與一遠程主機通信,但與服務器D所在局域網(wǎng)段的其它主機通信正常,到遠程網(wǎng)或遠程網(wǎng)自身的連接亦無故障。
可能原因:
1)主機D錯誤配置;
2)主機D網(wǎng)卡出錯;
3)主機D所在局域網(wǎng)段出了問題。
這些問題當中個別的不用分析器也可診斷或排除。例如:設想A中的第三種情況,就能通過檢查服務器A所在局域網(wǎng)的其它主機決定故障所在;設想D中的第二和第三種情況亦能通過這種方法確定(假設主機D能與局域網(wǎng)中其它主機通信)。
一臺服務器或主機的錯誤配置通過檢測很容易被發(fā)現(xiàn)。但另外一些問題,像網(wǎng)絡或網(wǎng)段中的故障,就需要分析器來診斷。
在以上所有可能的設想中,一開始或許會將分析器置于離最有可能出現(xiàn)問題的主機或是懷疑有問題的網(wǎng)絡、網(wǎng)段盡可能近的地方,但是如果未發(fā)現(xiàn)有意義的問題,得準備好移動分
析器,要知道,在出現(xiàn)故障的位置被確定以前,所做的一切都是建立在猜想基礎上的。在以上設想B的第三種情況中,服務器B所在局域網(wǎng)和網(wǎng)絡X中都應該有分析器,至少分析器應該能夠從一端被移動到另一端。
例如,一次故障中,一臺服務器突然停止了工作。人們起初懷疑是站點人員對服務器實施了誤操作所致,實際上跟蹤器表明,是因為眾多主機向服務器發(fā)送連接請求信息的同時服務器卻沒有響應,致使服務器死鎖。
在花了幾天時間來判斷到底服務器出了什么問題后,被告知觀察跟蹤器,于是請求站點操作員將跟蹤器從主機所在局域網(wǎng)(這里指設想B中第三種情況的網(wǎng)絡X)移到服務器所在局域網(wǎng)。結(jié)果發(fā)現(xiàn)訪問控制列表沒有被正確添加到服務器所在局域網(wǎng)的路由器上,這份錯誤的訪問控制列表過濾了所有來源于客戶端主機所在網(wǎng)絡的信息。假若當初多一些懷疑的話,就會發(fā)現(xiàn)在服務器所在局域網(wǎng)中根本就沒見到過連接請求信息。因為沒有同時查看網(wǎng)絡兩端的情況,致使站點很多天不能工作。
怎么知道跟蹤器在網(wǎng)絡的哪一端起作用呢?在跟蹤器中,發(fā)自客戶端主機的幀信息都具有實客戶端所有的源MAC地址,與此同時,目標MAC地址則存放在路由器中。
不幸的是,問題變得越來越復雜,僅僅知道分析器連接于哪個網(wǎng)絡還不夠。當將一個局域網(wǎng)分解成多個部分時,首要的是去找到空閑Hub端口或同軸電纜的分接頭,然而,在網(wǎng)絡交換環(huán)境下,并不是僅僅將分析器接入交換設備的空閑端口就萬事大吉了。
大多數(shù)交換設備都具備將特定端口指定為分接頭或映像端口的能力,只是所用術(shù)語因交換設備制造廠商不同而有別。如果所有來自或發(fā)往特定端口的通信同樣能發(fā)送到映像端口,這時只要將分析器連接到映像端口,所有設置即告完成。
但問題在于有些交換設備不能將兩端口之間的通信發(fā)送到映像端口。舉例說,在雙工環(huán)境下,作為監(jiān)控的連接之一部分的兩臺主機能同時發(fā)送信息,交換機也能接收每幀數(shù)據(jù)并將其傳輸?shù)芥溄又械牧硗舛丝凇5珜τ谟诚穸丝?,必須對某一?shù)據(jù)幀進行緩沖,如果這樣處理了太多幀,緩沖區(qū)就會溢出,數(shù)據(jù)幀就會丟失,跟蹤因此變得不可靠。更糟的是,根本就不知道是在跟蹤不可靠的線索。
某些交換設備支持內(nèi)部分析器功能,這類交換機本身能夠俘獲傳向被跟蹤對象的數(shù)據(jù)幀。這種功能部件的可靠性依賴于交換機的緩沖容量。在某些情況下,我們不得不選擇映像端口或是內(nèi)部分析器方式。但只要有可能,最好是將主機之一和分析器連接到Hub,并將Hub掛到交換機上。
為什么這么做呢?這是因為即使確信交換機有足夠容量緩存所有數(shù)據(jù)幀,以至于映像端口或內(nèi)部分析器不可能丟數(shù)據(jù),跟蹤仍然是不可靠的。例如,標準以太網(wǎng)中,一個處于交換機有故障端口的RJ45連接器每當交換機向服務器傳輸數(shù)據(jù)幀時都會創(chuàng)建交互式會話,交換機將此解釋成為一次沖突并停止工作,當嘗試16次之后數(shù)據(jù)幀就會撤消,但數(shù)據(jù)幀仍被發(fā)送到映像端口,因此跟蹤器發(fā)現(xiàn)了數(shù)據(jù)幀并顯示服務器響應失敗。另一種情況是:不合規(guī)格的配線導致1%的數(shù)據(jù)幀破壞。如果將分析器與第一種情況(任何位置的數(shù)據(jù)幀都能傳送)中提到的的主機一起掛到Hub,或者與第二種情況(網(wǎng)絡中有被破壞的數(shù)據(jù)幀)中主機一起掛到Hub,接收交換機的端口會在未將數(shù)據(jù)幀發(fā)往映像端口之前就將它們撤消,跟蹤器沒有任何錯誤指示。當然,每當改變一種方式,都得冒一定風險來糾正可能出現(xiàn)的意外問題。如果RJ45連接器出現(xiàn)故障僅僅是因為沒有在交換機端口將其固定好,那么只要將連接器重新插入Hub,故障或許也就不存在了,至少問題是得到了解決。
另外需要記住的是,對于交換設備,在其網(wǎng)段內(nèi)每個端口都是有效的,因此當連接到服務器的交換端口未發(fā)現(xiàn)問題時,應將Hub(或分析器)移動到主機或路由器交換端口。還有,注意不能將Hub掛到雙工環(huán)境。有些分析器能以雙工方式工作,這類分析器有兩個以太網(wǎng)口和一個功能模塊,功能模塊將通信對分為兩部分,并分別發(fā)送到每一以太網(wǎng)口,之后軟件把從每個以太網(wǎng)口接收來的數(shù)據(jù)結(jié)合成單一的跟蹤鏈。如果網(wǎng)絡是雙工環(huán)境,就需要這種分析器。
錯誤2 過多的過濾
過濾功能允許協(xié)議分析器忽略某些數(shù)據(jù)幀,從而為感興趣的幀騰出更多的俘獲緩沖空間。如果能過濾來源于較高協(xié)議層的數(shù)據(jù),如IP地址和端口號以至更高層數(shù)據(jù),則分析器幾乎很少需要基于源或目標MAC地址的過濾。然而,實際跟蹤中通常出現(xiàn)的問題是過濾太多。
有一個站點出現(xiàn)過這樣的故障:服務器與一特定客戶端之間的連接出了問題,莫名其妙地斷開了,其它客戶端都沒有任何問題。由于客戶端與服務器處在同一子網(wǎng),一旦發(fā)生斷開現(xiàn)象,使客戶端與服務器恢復連接的唯一辦法是重新啟動服務器。
這個站點安裝了分析器,同時因為數(shù)據(jù)量大,配置了過濾器,只允許俘獲兩主機(基于MAC地址)之間的數(shù)據(jù)幀。前兩天中沒有發(fā)現(xiàn)問題,但在第三天問題出現(xiàn)了:跟蹤表明服務器突然停止了發(fā)送多路會話和最后一次會話。當從服務器端ping客戶端時,跟蹤器顯示服務器沒有發(fā)送任何數(shù)據(jù)幀。站點操作員得出的結(jié)論是:TCP?;虿僮飨到y(tǒng)出了問題。于是請求另一次跟蹤,這次沒有使用過濾器。一天半以后俘獲了另一事件:跟蹤清楚表明服務器持續(xù)發(fā)送數(shù)據(jù),而與此同時卻再也沒有得到應答。經(jīng)過更深層挖掘,發(fā)現(xiàn)服務器數(shù)據(jù)幀的目標MAC地址突然改變了。
既然目標MAC地址不再與客戶端的相匹配,那么第一次未使用過濾器的跟蹤就不再俘獲到MAC地址,同時表明服務器已停止了工作。另外發(fā)現(xiàn)就在地址改變之前,服務器無故收到帶有為客戶端IP地址配置的新MAC地址的ARP信息包,這導致服務器升級ARP緩存并向錯誤主機發(fā)送數(shù)據(jù)。
通過ARP數(shù)據(jù)幀的源MAC地址由無故發(fā)送ARP的主機向下跟蹤,不知何故,主機居然同時配置了復用于客戶端的靜態(tài)IP地址和DHCP地址。當主機啟動時,分配的是靜態(tài)地址,這與服務器相沖突,于是調(diào)用DHCP,正確地址才配置上。
基于這一點可得出這樣一個結(jié)論:用過濾器看似很有道理,但很多時候問題的根源往往以假象出現(xiàn)在過濾器之外,如果跟蹤器沒有表明問題的起因,過濾器應當關閉,或至少應當擴展一下,直至跟蹤器確實查出原因。僅當所有過濾器都關閉后跟蹤器仍無法查出問題起因,才可以得出結(jié)論——對網(wǎng)絡已無計可施了。
錯誤3
俘獲時幀太短
前面例子中表明,站點操作員使用過濾器是因為網(wǎng)絡中數(shù)據(jù)量過大。分析器僅能俘獲大約3分鐘時間的數(shù)據(jù),這使得站點操作員幾乎不可能發(fā)現(xiàn)問題的發(fā)生并使分析器及時加以阻止以真正找到問題的起因。分析器能夠俘獲數(shù)據(jù)幀而沒有將它們填入俘獲緩沖區(qū)的時間長短取決于網(wǎng)絡的速度、網(wǎng)絡中幀的數(shù)量、幀的大小以及俘獲緩沖區(qū)的大小。
幾乎所有分析器都能控制俘獲數(shù)據(jù)幀的大小,這在處理連接問題和不太高協(xié)議層問題時顯得很有用。在通常情況下,只要俘獲數(shù)據(jù)的第一個64字節(jié)也就足夠了。因此,如果網(wǎng)絡中所有幀都是1024字節(jié)而僅有3分鐘俘獲時間,那么僅俘獲64字節(jié)將允許有超過30分鐘的俘獲時間。
錯誤4
觸發(fā)器安裝不正確
觸發(fā)器告訴分析器執(zhí)行某項操作,比如終止俘獲。當?shù)却龁栴}發(fā)生而又不知道將何時發(fā)生時,觸發(fā)器顯得很有用。
安裝觸發(fā)器意味著沒有必要隨時以手動方式來控制分析器。觸發(fā)器安裝的最大問題往往是沒有正確定義,這會大大延長解決問題的時間。
當然,應該詳細知道怎樣安裝觸發(fā)器,并且,若有可能,在使用之前進行測試。有時可以安裝另一臺分析器來發(fā)送觸發(fā)數(shù)據(jù)幀,以確認俘獲分析觸發(fā)器已正確安裝。
使用觸發(fā)器帶來的另一問題是,許多分析器允許設置將被預觸發(fā)的俘獲緩沖區(qū)的百分比。舉例來說,可以指定50%的緩沖區(qū)在觸發(fā)之前俘獲,而另外50%的緩沖區(qū)在觸發(fā)之后俘獲。預觸發(fā)的百分比通常是0、25、50、75或100。
如果預觸發(fā)值設置不當,就有可能俘獲不到足夠的相關數(shù)據(jù)幀來診斷問題所在。預觸發(fā)值有可能被錯誤設置是因為其默認設置對現(xiàn)行問題往往不適用:也許是因為未將針對前一問題的設置升級,也許是因為粗心的鼠標操作或錯誤按鍵。無論何種原因,一定要確認觸發(fā)器已正確安裝。
那么怎樣來設置呢?通常是將預觸發(fā)百分比設為100%,以知道是什么原因?qū)е掠|發(fā)器關閉。
當然,只有當觸發(fā)器在觸發(fā)某事件時,它才處于關閉狀態(tài)。過去使用過特殊的觸發(fā)程序,它能測試狀態(tài),然后發(fā)送信息包,分析器可將此信息包用作觸發(fā)器。測試狀態(tài)可以是日志文件中的錯誤信息,或是上例中無法創(chuàng)建連接的情況。一般整個程序也就一百多行或稍長一些。錯誤5
日期/時間設置不正確
沒有正確設置分析器上的日期/時間看似一件小事,很多時候可能也確實是這樣。然而,當處理廣域網(wǎng)絡中的問題時,有時同時運行兩臺分析器,網(wǎng)絡每端一臺,則正確設置日期/時間是相當有用的。
如果將兩臺分析器時鐘設置相同,調(diào)整跟蹤會變得更為容易。假定在一個例子中,通過發(fā)現(xiàn)通用幀并比較時間,會發(fā)現(xiàn)其中一臺用了4小時37分,比另一臺提前了15.7891秒,如果時鐘設置同步誤差在1到2秒,時間差距計算也就容易多了。
另外,如果需要費勁地隨主機中的事件調(diào)整跟蹤,由于基于時間包的同步是不可選的,則設置相同的日期/時間絕對具有實質(zhì)意義。
錯誤6 不理解協(xié)議
很多分析器具有“專家分析”功能,指的是它們能保持對信息的追蹤,像序列號、時間信息、顯示重傳信息、凍結(jié)窗口、無應答狀態(tài)等等。這類分析相當有用,但也有可能造成誤導,尤其在分析器沒有正確報錯時。
舉個例子,有一種情況:從一遠程位置發(fā)來的遠程登錄會話無法建立,而發(fā)自局域工作站的遠程登錄會話卻沒有問題。于是站點操作人員在遠程登錄服務器所在的局域網(wǎng)掛一分析器,跟蹤器表明從遠程主機到遠程登錄服務器的數(shù)據(jù)幀沒有報錯;于是他們得出結(jié)論是操作系統(tǒng)故障。
另一位操作人員查看跟蹤器發(fā)現(xiàn),局域端遠程登錄會話連接到端口2323,而遠程會話連接到端口23。另外,遠程登錄服務器響應遠程連接請求的信息包包含了RST標志設置。在這里,站點操作人員沒有仔細查看TCP細節(jié),因此沒有意識到不同端口號和RST包的重要性,他們依賴來源于分析器的診斷信息,既然遠程登錄服務器的端口23沒有安裝,憑感覺猜想也認為是操作系統(tǒng)出了問題。然而,若站點工作人員了解TCP和遠程登錄,他們就會立即發(fā)現(xiàn)問題所在并能在5分鐘內(nèi)找到一個好的解決辦法。
事實上是,他們等半天時間來安裝跟蹤器,結(jié)果失去了遠程網(wǎng)上數(shù)目相當可觀的客戶。
第三篇:Web服務器實驗3報告
操作系統(tǒng)實驗報告三
姓名:陳玉博
學號:2011011207
日期:2013-11-24
【實驗內(nèi)容】:設計一段內(nèi)存結(jié)構(gòu),能夠緩存一定數(shù)量的網(wǎng)頁,在客戶端訪問時,首先從內(nèi)存中查找是否存在客戶端訪問的網(wǎng)頁內(nèi)容,如果存在,則直接從內(nèi)存中將相應的內(nèi)容返回給客戶端;如果不存在,則從磁盤中將網(wǎng)頁內(nèi)容讀入到內(nèi)存,并返回給客戶端。【實驗思路】:客戶端連接之后,在線程的處理函數(shù)handle()函數(shù)中,從內(nèi)存中查找相應的網(wǎng)頁內(nèi)容,發(fā)送至客戶端。如果在內(nèi)存中找不到,則通過調(diào)用store()函數(shù)從磁盤中讀取該網(wǎng)頁到內(nèi)存,當內(nèi)存中的網(wǎng)頁個數(shù)大于100的時候,通過某種算法從內(nèi)存中移除某個網(wǎng)頁,然后重新存入新的網(wǎng)頁。在主函數(shù)中,連接成功以后調(diào)用handle()函數(shù),然后在handle()函數(shù)中,如果找不到請求的網(wǎng)頁,則調(diào)用store()函數(shù)?!局饕a及注釋】----main函數(shù):
void main(int argc, _TCHAR* argv[]){ //聲明處理函數(shù),作為QueueUserWorkItem的一個參數(shù)
DWORD WINAPI handle(void *);//初始化WinSock庫
WORD wVersionRequested;WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
int wsaret=WSAStartup(wVersionRequested,&wsaData);if(wsaret)
return;//創(chuàng)建SOCKET
SOCKET socketSrv;
socketSrv=socket(AF_INET,SOCK_STREAM,0);if(socketSrv==INVALID_SOCKET)
return;SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(87);
//綁定套接字
if(bind(socketSrv,(struct sockaddr*)&addrSrv,sizeof(SOCKADDR))){ //關閉連接
shutdown(socketSrv,1);closesocket(socketSrv);
WSACleanup();return;} //等待客戶端連接
SOCKADDR_IN addrCli;int len=sizeof(SOCKADDR);//監(jiān)聽端口
if(listen(socketSrv,5)==SOCKET_ERROR){ printf(“監(jiān)聽失敗!n”);} while(true){ //接受連接
SOCKET socketconn= accept(socketSrv,(SOCKADDR*)&addrCli, &len);
if(socketconn==SOCKET_ERROR)
{
cout<<“接受連接失?。 ?
return;
}
cout<<“連接成功”< shutdown(socketSrv,1);closesocket(socketSrv); WSACleanup();return;}----handle函數(shù): DWORD WINAPI handle(void *para){ //聲明store函數(shù),用來從磁盤中讀取網(wǎng)頁內(nèi)容到內(nèi)存 void store(string);SOCKET socketconn=(SOCKET)para;//連接成功后與客戶端進行會話 char recvBuff[1024];string sendBuff; string locDir;ifstream fp;//接收請求 if(recv(socketconn,recvBuff,1024,0)==SOCKET_ERROR)return 0;//讀取http請求頭 string recvBuffer=recvBuff;int posGet=recvBuffer.find(“GET”,0);int posHttp=recvBuffer.find(“HTTP”,0);for(int pos=posGet+4;pos locDir.push_back(''); continue;} locDir.push_back(recvBuffer[pos]);} int len=locDir.length();//截取網(wǎng)頁的文件名 string ine_str=locDir.substr(1,len-2);//從內(nèi)存中獲得該網(wǎng)頁的內(nèi)容 string allcontent=webhtml[ine_str];//如果在內(nèi)存中找不到,則再從磁盤中把網(wǎng)頁讀入內(nèi)存,然后再從內(nèi)存中查找 if(allcontent==“"){ //調(diào)用store函數(shù),從磁盤中重新讀取網(wǎng)頁內(nèi)容 store(ine_str);//重新從內(nèi)存中讀取網(wǎng)頁內(nèi)容 allcontent=webhtml[ine_str];} //將讀取的內(nèi)容追加入sendBuff中 sendBuff.append(allcontent);fp.close();//響應請求,將頁面信息發(fā)送到客戶端 if(send(socketconn,sendBuff.c_str(),sendBuff.length(),0)==SOCKET_ERROR){ cout<<”傳送文件錯誤!“; return 0;} shutdown(socketconn,1);closesocket(socketconn);//關閉連接 return 0;}----Store()函數(shù): void store(string ine_str){ //如果內(nèi)存中的網(wǎng)頁個數(shù)大于100個,則把第一個移除 if(webhtml.size()>100){ map char buffer[1024*10];//每次讀取1024個字節(jié)到緩存 ifstream fp;//文件流 fp.open((loc_webpage+ine_str).c_str(),std::ios::binary);//打開指定文件 if(fp.fail())cout<<”存儲文件失敗!"< fp.getline(buffer,1024*10);//從文件中讀取1024個字節(jié)到緩沖區(qū)里面 allchars.append(buffer);//把緩存中的字節(jié)加到allchars后面 buffer[0]='