當前位置:首頁 » 操作系統 » http協議源碼

http協議源碼

發布時間: 2022-08-17 12:52:38

㈠ 遠程訪問用的是http協議,下面是源代碼

結論:①string URi = "http://192.168.0.105//www/";
URi的值應該是一個URL地址吧,怎麼105後面有兩個/
②你這樣的訪問方式涉及到客戶端對伺服器端的訪問許可權問題,我沒試過以這樣的方式將文件上傳到伺服器的,而且我覺得應該不是這樣的方式。
解決方案建議:
①可以在伺服器端開通ftp功能,將文件發送到ftp里,代碼如下:
privatevoidbutton1_Click(objectsender,EventArgse)

{

WebClientw=newWebClient();

w.Credentials=newNetworkCredential("sa","sa");//登陸ftp的用戶名密碼

w.UploadFile("ftp://221.224.78.82/skdb/up.xls",@"e:\1.xls");////前面是遠程ftp文件夾路徑後面是:本地上傳的文件路徑

w.Dispose();

MessageBox.Show("上傳成功!");

}

②伺服器端有IIS的話通過WebService的方式實現文件上傳
這個方法相對比較復雜,建議用第一種,如果要採用這種的話到時我再發一個例子給你⊙﹏⊙

㈡ delphi HTTP協議取網頁源碼

以下方法就是DELPHI的


uses UrlMon; //urlmon包含urldownloadtofile函數

使用如下方法下載

UrlDownloadToFile(nil, PChar('http://www..com/'), PChar('index.htm'), 0, nil);

㈢ 網路編程什麼是http協議http常用的請求方法是什麼

目前通用的編程語言有兩種形式:匯編語言和高級語言。

匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。匯編程序通常由三部分組成:指令、偽指令和宏指令。匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。

高級語言是目前絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。

高級語言主要是相對於匯編語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。

高級語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:

解釋類:執行方式類似於我們日常生活中的「同聲翻譯」,應用程序源代碼一邊由相應語言的解釋器「翻譯」成目標代碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行文件,應用程序不能脫離其解釋器,但這種方式比較靈活,可以動態地調整、修改應用程序。

編譯類:編譯是指在應用源程序執行之前,就將程序源代碼「翻譯」成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(* .OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的,例如Visual C++、Visual Foxpro、Delphi等。

㈣ HTTP協議是什麼意思

HTTP協議指的是超文本傳輸協議。

超文本傳輸協議是互聯網上應用最為廣泛的一種網路協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。

1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本。這成為了HTTP超文本傳輸協議標准架構的發展根基。Ted Nelson組織協調萬維網協會和互聯網工程工作小組共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

(4)http協議源碼擴展閱讀:

HTTP協議的主要特點:

1、簡單快速

客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有 GET、HEAD、POST,每種方法規定了客戶與伺服器聯系的類型不同。由於 HTTP 協議簡單,使得 HTTP 伺服器的程序規模小,因而通信速度很快。

2、無連接

無連接的含義是限制每次連接只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。

3、無狀態

HTTP 協議是無狀態協議,無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在伺服器不需要先前信息時它的應答就較快。

㈤ 使用HTTP協議實現文件批量傳輸從A伺服器到B伺服器。要求有客戶端和服務端。希望給出成功源碼參考。

就算你給15塊也沒人給你做。

㈥ HTTP,SSL/TLS和HTTPS協議的區別與聯系

概述:HTTP是普通明文傳輸協議,HTTPS是加密協議,相當於HTTP的安全版本,但需要HTTPS加密必須擁有SSL證書與TLS協議交流產生,SSL證書在線簽發:網頁鏈接

1、「HTTP」是什麼?

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網路協議,所有的WWW文件都必須遵守這個標准,設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法(具體可查看馬海祥博客《深入解析互聯網協議的原理》的相關介紹)。

1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標准架構的發展根基。

簡單來說,HTTP就是一個網路協議,是專門用來幫你傳輸Web內容的,關於這個協議,就算你不了解,至少也聽說過吧?比如你訪問我的博客的主頁,瀏覽器地址欄會出現的網址:http://www.mahaixiang.cn,大部分網站都是通過HTTP協議來傳輸Web頁面、以及Web頁面上包含的各種東東(圖片、CSS 樣式、JS 腳本)。

2、「SSL/TLS」是什麼?

SSL是「Secure Sockets Layer」的縮寫,中文叫做「安全套接層」,它是在上世紀90年代中期,由網景公司設計的(順便插一句,網景公司不光發明了 SSL,還發明了很多 Web 的基礎設施——比如「CSS 樣式表」和「JS 腳本」)。

為啥要發明SSL這個協議捏?因為原先互聯網上使用的HTTP協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改,發明SSL協議,就是為了解決這些問題。

到了1999年,SSL因為應用廣泛,已經成為互聯網上的事實標准,IETF就在那年把SSL標准化,標准化之後的名稱改為TLS(是「Transport Layer Security」的縮寫),中文叫做「傳輸層安全協議」。

很多相關的文章都把這兩者並列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。

3、「HTTPS」是什麼意思?

解釋完 HTTP 和 SSL/TLS,現在就可以來解釋 HTTPS 啦,咱們通常所說的 HTTPS 協議,說白了就是「HTTP 協議」和「SSL/TLS 協議」的組合,你可以把 HTTPS 大致理解為——「HTTP over SSL」或「HTTP over TLS」(反正 SSL 和 TLS 差不多)。

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

它是一個URI scheme(抽象標識符體系),句法類同http:體系,用於安全的HTTP數據傳輸。

https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的默認埠及一個加密/身份驗證層(在HTTP與TCP之間),這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法,現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。

4、談談「對稱加密」和「非對稱加密」的概念

如果我們想搞明白「對稱加密」和「非對稱加密」的概念,首先,我們就要先知道什麼是「加密」和「解密」?

(1)、什麼是「加密」和「解密」?

通俗而言,你可以把「加密」和「解密」理解為某種互逆的數學運算,就好比「加法和減法」互為逆運算、「乘法和除法」互為逆運算。

「加密」的過程,就是把「明文」變成「密文」的過程;反之,「解密」的過程,就是把「密文」變為「明文」,在這兩個過程中,都需要一個關鍵的東東——叫做「密鑰」——來參與數學運算。

(2)、什麼是「對稱加密」?

所謂的「對稱加密技術」,意思就是說:「加密」和「解密」使用相同的密鑰。這個比較好理解,就好比你用 7zip 或 WinRAR 創建一個帶密碼(口令)的加密壓縮包,當你下次要把這個壓縮文件解開的時候,你需要輸入同樣的密碼,在這個例子中,密碼/口令就如同剛才說的「密鑰」。

對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key),這種方法在密碼學中叫做對稱加密演算法,對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。

(3)、什麼是「非對稱加密」?

所謂的「非對稱加密技術」,意思就是說:「加密」和「解密」使用不同的密鑰,這玩意兒比較難理解,也比較難想到,當年「非對稱加密」的發明,還被譽為「密碼學」歷史上的一次革命。

非對稱加密為數據的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key),私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人,非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。

由於篇幅有限,對「非對稱加密」這個話題,我就不展開了,有空的話,我會再單獨寫一篇文章在馬海祥博客上發布。

(4)、各自有啥優缺點?

看完剛才的定義,很顯然:(從功能角度而言)「非對稱加密」能乾的事情比「對稱加密」要多,這是「非對稱加密」的優點,但是「非對稱加密」的實現,通常需要涉及到「復雜數學問題」,所以,「非對稱加密」的性能通常要差很多(相對於「對稱加密」而言)。

這兩者的優缺點,也影響到了 SSL 協議的設計。

5、HTTP協議的特點

作為背景知識介紹,還需要再稍微談一下 HTTP 協議本身的特點,HTTP本身有很多特點,考慮到篇幅有限,馬海祥只談那些和HTTPS相關的特點,想要了解更深入的HTTP知識,可查看馬海祥博客《HTTP服務的七層架構技術解析及運用》的相關介紹。

(1)、HTTP的版本和歷史

如今咱們用的 HTTP 協議,版本號是 1.1(也就是 HTTP 1.1),這個 1.1 版本是1995年底開始起草的(技術文檔是RFC2068),並在1999年正式發布(技術文檔是RFC2616)。

在 1.1 之前,還有曾經出現過兩個版本「0.9 和 1.0」,其中的 HTTP 0.9 沒有被廣泛使用,而 HTTP 1.0 被廣泛使用過。

(2)、HTTP 和 TCP 之間的關系

簡單地說,TCP 協議是 HTTP 協議的基石——HTTP 協議需要依靠 TCP 協議來傳輸數據。

在網路分層模型中,TCP 被稱為「傳輸層協議」,而 HTTP 被稱為「應用層協議」。

有很多常見的應用層協議是以 TCP 為基礎的,比如「FTP、SMTP、POP、IMAP」等。

TCP被稱為「面向連接」的傳輸層協議,關於它的具體細節,俺就不展開了(否則篇幅又失控了),你只需知道:傳輸層主要有兩個協議,分別是TCP和UDP,TCP比UDP更可靠,你可以把 TCP 協議想像成某個水管,發送端這頭進水,接收端那頭就出水,並且 TCP 協議能夠確保,先發送的數據先到達(與之相反,UDP不保證這點)。

(3)、HTTP協議如何使用 TCP 連接?

HTTP對 TCP 連接的使用,分為兩種方式:俗稱「短連接」和「長連接」(「長連接」又稱「持久連接」,叫做「Keep-Alive」或「Persistent Connection」)

假設有一個網頁,裡麵包含好多圖片,還包含好多外部的CSS文件和JS文件,在「短連接」的模式下,瀏覽器會先發起一個 TCP 連接,拿到該網頁的 HTML 源代碼(拿到 HTML 之後,這個 TCP 連接就關閉了)。然後,瀏覽器開始分析這個網頁的源碼,知道這個頁麵包含很多外部資源(圖片、CSS、JS)。然後針對每一個外部資源,再分別發起一個個 TCP 連接,把這些文件獲取到本地(同樣的,每抓取一個外部資源後,相應的 TCP 就斷開)。

相反,如果是「長連接」的方式,瀏覽器也會先發起一個 TCP 連接去抓取頁面,但是抓取頁面之後,該 TCP 連接並不會立即關閉,而是暫時先保持著(所謂的「Keep-Alive」),然後瀏覽器分析 HTML 源碼之後,發現有很多外部資源,就用剛才那個 TCP 連接去抓取此頁面的外部資源。

在 HTTP 1.0 版本,默認使用的是「短連接」(那時候是 Web 誕生初期,網頁相對簡單,「短連接」的問題不大)。

到了1995年底開始制定 HTTP 1.1 草案的時候,網頁已經開始變得復雜(網頁內的圖片、腳本越來越多了),這時候再用短連接的方式,效率太低下了(因為建立 TCP 連接是有「時間成本」和「CPU成本」),所以,在 HTTP 1.1 中,默認採用的是「Keep-Alive」的方式。

6、SSL/TLS協議的基本運行過程

SSL/TLS協議的基本思路是採用公鑰加密法,也就是說,客戶端先向伺服器端索要公鑰,然後用公鑰加密信息,伺服器收到密文後,用自己的私鑰解密,但是這里有兩個問題:

(1)、如何保證公鑰不被篡改?

解決方法:將公鑰放在數字證書中,只要證書是可信的,公鑰就是可信的。

(2)、公鑰加密計算量太大,如何減少耗用的時間?

解決方法:每一次對話(session),客戶端和伺服器端都生成一個"對話密鑰"(session key),用它來加密信息。由於"對話密鑰"是對稱加密,所以運算速度非常快,而伺服器公鑰只用於加密"對話密鑰"本身,這樣就減少了加密運算的消耗時間。

因此,SSL/TLS協議的基本過程是這樣的:

(1)、客戶端向伺服器端索要並驗證公鑰。

(2)、雙方協商生成「對話密鑰」。

(3)、雙方採用「對話密鑰」進行加密通信。

7、SSL、HTTP和HTTPS協議的聯系

SSL是Netscape公司所提出的安全保密協議,在瀏覽器(如Internet Explorer、Netscape Navigator)和Web伺服器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之間構造安全通道來進行數據傳輸,SSL運行在TCP/IP層之上、應用層之下,為應用程序提供加密數據通道,它採用了RC4、MD5 以及RSA等加密演算法,使用40位的密鑰,適用於商業信息的加密。

同時,Netscape公司相應開發了HTTPS協議並內置於其瀏覽器中,HTTPS實際上就是SSL over HTTP,它使用默認埠443,而不是像HTTP那樣使用埠80來和TCP/IP進行通信。HTTPS協議使用SSL在發送方把原始數據進行加密,然後在接受方進行解密,加密和解密需要發送方和接受方通過交換共知的密鑰來實現,因此,所傳送的數據不容易被網路黑客截獲和解密。

然而,加密和解密過程需要耗費系統大量的開銷,嚴重降低機器的性能,相關測試數據表明使用HTTPS協議傳輸數據的工作效率只有使用HTTP協議傳輸的十分之一。

假如為了安全保密,將一個網站所有的Web應用都啟用SSL技術來加密,並使用HTTPS協議進行傳輸,那麼該網站的性能和效率將會大大降低,而且沒有這個必要,因為一般來說並不是所有數據都要求那麼高的安全保密級別,所以,我們只需對那些涉及機密數據的交互處理使用HTTPS協議,這樣就做到魚與熊掌兼得(具體可查看馬海祥博客《從SEO的角度來分析網站是否該採用HTTPS協議》的相關介紹)。

總之不需要用https的地方,就盡量不要用。

8、HTTPS協議的需求是什麼?

花了好多口水,終於把背景知識說完了,下面正式進入正題,先來說說當初設計HTTPS是為了滿足哪些需求?

很多介紹 HTTPS 的文章一上來就給你講實現細節,對此,馬海祥覺得這是不好的做法,一上來就給你講協議細節,你充其量只能知道如何做,無法理解為什麼,我在前一個章節講了「背景知識」,在這個章節講了「需求」,這就有助於你理解了。

為什麼要設計成這樣?——這就是 WHY 型的問題。

(1)、兼容性

因為是先有 HTTP 再有 HTTPS,所以,HTTPS 的設計者肯定要考慮到對原有 HTTP 的兼容性。

這里所說的兼容性包括很多方面,比如已有的 Web 應用要盡可能無縫地遷移到 HTTPS;比如對瀏覽器廠商而言,改動要盡可能小。

基於「兼容性」方面的考慮,很容易得出如下幾個結論:

①、HTTPS還是要基於 TCP 來傳輸

如果改為 UDP 作傳輸層,無論是 Web 服務端還是瀏覽器客戶端,都要大改,動靜太大了。

②、單獨使用一個新的協議,把 HTTP 協議包裹起來

所謂的「HTTP over SSL」,實際上是在原有的 HTTP 數據外面加了一層 SSL 的封裝,HTTP 協議原有的 GET、POST 之類的機制,基本上原封不動。

打個比方:如果原來的 HTTP 是塑料水管,容易被戳破;那麼如今新設計的 HTTPS 就像是在原有的塑料水管之外,再包一層金屬水管,一來,原有的塑料水管照樣運行;二來,用金屬加固了之後,不容易被戳破。

(2)、可擴展性

前面說了,HTTPS 相當於是「HTTP over SSL」。

如果 SSL 這個協議在「可擴展性」方面的設計足夠牛逼,那麼它除了能跟 HTTP 搭配,還能夠跟其它的應用層協議搭配,豈不美哉?

現在看來,當初設計 SSL 的人確實比較牛,如今的 SSL/TLS 可以跟很多常用的應用層協議(比如:FTP、SMTP、POP、Telnet)搭配,來強化這些應用層協議的安全性。

接著剛才打的比方:如果把 SSL/TLS 視作一根用來加固的金屬管,它不僅可以用來加固輸水的管道,還可以用來加固輸煤氣的管道。

(3)、保密性(防泄密)

HTTPS需要做到足夠好的保密性。

說到保密性,首先要能夠對抗嗅探(行話叫 Sniffer),所謂的「嗅探」,通俗而言就是監視你的網路傳輸流量,如果你使用明文的 HTTP 上網,那麼監視者通過嗅探,就知道你在訪問哪些網站的哪些頁面。

嗅探是最低級的攻擊手法,除了嗅探,HTTPS 還需要能對抗其它一些稍微高級的攻擊手法——比如「重放攻擊」(後面講協議原理的時候,會再聊)。

(4)、完整性(防篡改)

除了「保密性」,還有一個同樣重要的目標是「確保完整性」。

在發明 HTTPS 之前,由於 HTTP 是明文的,不但容易被嗅探,還容易被篡改。

舉個例子:比如咱們的網路運營商(ISP)都比較流氓,經常有網友抱怨說訪問某網站(本來是沒有廣告的),竟然會跳出很多中國電信的廣告,為啥會這樣呢?因為你的網路流量需要經過 ISP 的線路才能到達公網,如果你使用的是明文的 HTTP,ISP 很容易就可以在你訪問的頁面中植入廣告。

所以,當初設計 HTTPS 的時候,還有一個需求是「確保 HTTP 協議的內容不被篡改」。

(5)、真實性(防假冒)

在談到 HTTPS 的需求時,「真實性」經常被忽略,其實「真實性」的重要程度不亞於前面的「保密性」和「完整性」。

舉個例子:你因為使用網銀,需要訪問該網銀的 Web 站點,那麼,你如何確保你訪問的網站確實是你想訪問的網站?

有些天真的同學會說:通過看網址裡面的域名,來確保,為啥說這樣的同學是「天真的」?因為 DNS 系統本身是不可靠的(尤其是在設計 SSL 的那個年代,連 DNSSEC 都還沒發明),由於 DNS 的不可靠(存在「域名欺騙」和「域名劫持」),你看到的網址裡面的域名未必是真實滴!

所以,HTTPS 協議必須有某種機制來確保「真實性」的需求(至於如何確保,後面會細聊)。

9、HTTPS和HTTP的區別

超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。

為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。

一般來說,HTTPS和HTTP的區別主要為以下四點:

(1)、https協議需要到ca申請證書,一般免費證書很少,需要交費。

(2)、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

(3)、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。

(4)、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全(具體可查看馬海祥博客《HTTP與HTTPS的區別》的相關介紹)。

10、HTTPS和HTTP的性能比較

再來說最後一個需求——性能。

本來簡單的http協議,一個get一個response,由於https要還密鑰和確認加密演算法的需要,單握手就需要6、7個往返,任何應用中,過多的round trip肯定影響性能,接下來才是具體的http協議,每一次響應或者請求,都要求客戶端和服務端對會話的內容做加密/解密。

盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL晶元,如果CPU信能比較低的話,肯定會降低性能,從而不能serve更多的請求,加密後數據量的影響,所以,才會出現那麼多的安全認證提示(具體可查看馬海祥博客《HTTPS對網站性能優化的影響》的相關介紹)。

一般來說,引入HTTPS之後,不能導致性能變得太差,否則的話,誰還願意用?

為了確保性能,SSL 的設計者至少要考慮如下幾點:

(1)、如何選擇加密演算法(「對稱」or「非對稱」)?

(2)、如何兼顧 HTTP 採用的「短連接」TCP 方式?

SSL 是在1995年之前開始設計的,那時候的 HTTP 版本還是 1.0,默認使用的是「短連接」的 TCP 方式——默認不啟用 Keep-Alive。

HTTPS的關鍵性能影響是CPU和往返,如果CPU很強的話,性能可能就是有人講的80%;如果cpu是瓶頸的話,有人講原來可以server330-500個請求每秒,現在只有30-50%,因此在使用https請求數據的時候要注意看看你的項目裡面是否真的需要。

㈦ http協議解析 請求行的信息怎麼提取 c語言源碼

實現步驟:
1)用Wireshark軟體抓包得到test.pcap文件
2)程序:分析pcap文件頭 -> 分析pcap_pkt頭 -> 分析幀頭 -> 分析ip頭 -> 分析tcp頭 -> 分析http信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<time.h>
#define BUFSIZE 10240
#define STRSIZE 1024
typedef long bpf_int32;
typedef unsigned long bpf_u_int32;
typedef unsigned short u_short;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned char u_int8;
//pacp文件頭結構體
struct pcap_file_header
{
bpf_u_int32 magic; /* 0xa1b2c3d4 */
u_short version_major; /* magjor Version 2 */
u_short version_minor; /* magjor Version 4 */
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
//時間戳
struct time_val
{
long tv_sec; /* seconds 含義同 time_t 對象的值 */
long tv_usec; /* and microseconds */
};
//pcap數據包頭結構體
struct pcap_pkthdr
{
struct time_val ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
//數據幀頭
typedef struct FramHeader_t
{ //Pcap捕獲的數據幀頭
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //幀類型
} FramHeader_t;
//IP數據報頭
typedef struct IPHeader_t
{ //IP數據報頭
u_int8 Ver_HLen; //版本+報頭長度
u_int8 TOS; //服務類型
u_int16 TotalLen; //總長度
u_int16 ID; //標識
u_int16 Flag_Segment; //標志+片偏移
u_int8 TTL; //生存周期
u_int8 Protocol; //協議類型
u_int16 Checksum; //頭部校驗和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
} IPHeader_t;
//TCP數據報頭
typedef struct TCPHeader_t
{ //TCP數據報頭
u_int16 SrcPort; //源埠
u_int16 DstPort; //目的埠
u_int32 SeqNO; //序號
u_int32 AckNO; //確認號
u_int8 HeaderLen; //數據報頭的長度(4 bit) + 保留(4 bit)
u_int8 Flags; //標識TCP不同的控制消息
u_int16 Window; //窗口大小
u_int16 Checksum; //校驗和
u_int16 UrgentPointer; //緊急指針
}TCPHeader_t;
//
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len); //查找 http 信息函數
//
int main()
{
struct pcap_file_header *file_header;
struct pcap_pkthdr *ptk_header;
IPHeader_t *ip_header;
TCPHeader_t *tcp_header;
FILE *fp, *output;
int pkt_offset, i=0;
int ip_len, http_len, ip_proto;
int src_port, dst_port, tcp_flags;
char buf[BUFSIZE], my_time[STRSIZE];
char src_ip[STRSIZE], dst_ip[STRSIZE];
char host[STRSIZE], uri[BUFSIZE];
//初始化
file_header = (struct pcap_file_header *)malloc(sizeof(struct pcap_file_header));
ptk_header = (struct pcap_pkthdr *)malloc(sizeof(struct pcap_pkthdr));
ip_header = (IPHeader_t *)malloc(sizeof(IPHeader_t));
tcp_header = (TCPHeader_t *)malloc(sizeof(TCPHeader_t));
memset(buf, 0, sizeof(buf));
//
if((fp = fopen(「test.pcap」,」r」)) == NULL)
{
printf(「error: can not open pcap file\n」);
exit(0);
}
if((output = fopen(「output.txt」,」w+」)) == NULL)
{
printf(「error: can not open output file\n」);
exit(0);
}
//開始讀數據包
pkt_offset = 24; //pcap文件頭結構 24個位元組
while(fseek(fp, pkt_offset, SEEK_SET) == 0) //遍歷數據包
{
i++;
//pcap_pkt_header 16 byte
if(fread(ptk_header, 16, 1, fp) != 1) //讀pcap數據包頭結構
{
printf(「\nread end of pcap file\n」);
break;
}
pkt_offset += 16 + ptk_header->caplen; //下一個數據包的偏移值
strftime(my_time, sizeof(my_time), 「%Y-%m-%d %T」, localtime(&(ptk_header->ts.tv_sec))); //獲取時間
// printf(「%d: %s\n」, i, my_time);
//數據幀頭 14位元組
fseek(fp, 14, SEEK_CUR); //忽略數據幀頭
//IP數據報頭 20位元組
if(fread(ip_header, sizeof(IPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
inet_ntop(AF_INET, (void *)&(ip_header->SrcIP), src_ip, 16);
inet_ntop(AF_INET, (void *)&(ip_header->DstIP), dst_ip, 16);
ip_proto = ip_header->Protocol;
ip_len = ip_header->TotalLen; //IP數據報總長度
// printf(「%d: src=%s\n」, i, src_ip);
if(ip_proto != 0×06) //判斷是否是 TCP 協議
{
continue;
}
//TCP頭 20位元組
if(fread(tcp_header, sizeof(TCPHeader_t), 1, fp) != 1)
{
printf(「%d: can not read ip_header\n」, i);
break;
}
src_port = ntohs(tcp_header->SrcPort);
dst_port = ntohs(tcp_header->DstPort);
tcp_flags = tcp_header->Flags;
// printf(「%d: src=%x\n」, i, tcp_flags);
if(tcp_flags == 0×18) // (PSH, ACK) 3路握手成功後
{
if(dst_port == 80) // HTTP GET請求
{
http_len = ip_len – 40; //http 報文長度
match_http(fp, 「Host: 「, 「\r\n」, host, http_len); //查找 host 值
match_http(fp, 「GET 「, 「HTTP」, uri, http_len); //查找 uri 值
sprintf(buf, 「%d: %s src=%s:%d dst=%s:%d %s%s\r\n」, i, my_time, src_ip, src_port, dst_ip, dst_port, host, uri);
//printf(「%s」, buf);
if(fwrite(buf, strlen(buf), 1, output) != 1)
{
printf(「output file can not write」);
break;
}
}
}
} // end while
fclose(fp);
fclose(output);
return 0;
}
//查找 HTTP 信息
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len)
{
int i;
int http_offset;
int head_len, tail_len, val_len;
char head_tmp[STRSIZE], tail_tmp[STRSIZE];
//初始化
memset(head_tmp, 0, sizeof(head_tmp));
memset(tail_tmp, 0, sizeof(tail_tmp));
head_len = strlen(head_str);
tail_len = strlen(tail_str);
//查找 head_str
http_offset = ftell(fp); //記錄下HTTP報文初始文件偏移
while((head_tmp[0] = fgetc(fp)) != EOF) //逐個位元組遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, head_str);
exit(0);
}
if(head_tmp[0] == *head_str) //匹配到第一個字元
{
for(i=1; i<head_len; i++) //匹配 head_str 的其他字元
{
head_tmp[i]=fgetc(fp);
if(head_tmp[i] != *(head_str+i))
break;
}
if(i == head_len) //匹配 head_str 成功,停止遍歷
break;
}
}
// printf(「head_tmp=%s \n」, head_tmp);
//查找 tail_str
val_len = 0;
while((tail_tmp[0] = fgetc(fp)) != EOF) //遍歷
{
if((ftell(fp) – http_offset) > total_len) //遍歷完成
{
sprintf(buf, 「can not find %s \r\n」, tail_str);
exit(0);
}
buf[val_len++] = tail_tmp[0]; //用buf 存儲 value 直到查找到 tail_str
if(tail_tmp[0] == *tail_str) //匹配到第一個字元
{
for(i=1; i<tail_len; i++) //匹配 head_str 的其他字元
{
tail_tmp[i]=fgetc(fp);
if(tail_tmp[i] != *(tail_str+i))
break;
}
if(i == tail_len) //匹配 head_str 成功,停止遍歷
{
buf[val_len-1] = 0; //清除多餘的一個字元
break;
}
}
}
// printf(「val=%s\n」, buf);
fseek(fp, http_offset, SEEK_SET); //將文件指針 回到初始偏移
}

㈧ "http"的含義

它是超文本傳輸議(Hyper Text Transport Protocol,簡稱HTTP )是WWW所採用的標准傳輸協議。它的作用是提供瀏覽器與WWW伺服器之間的通信。每一次交互包括一個ASCII形式的請求,和一個與RFC 822類似的MIME的應答。HTTP通常建立在TCP基礎上,而在ATM網路中,將基於AAL5信息包傳輸。
HTTP由兩類元素組成:從瀏覽器到伺服器的請求集合和從反方向來的應答集合。
HTTP支持兩種請求:簡單請求和完全請求。

熱點內容
安卓手機藍牙默認地址在哪裡 發布:2025-01-18 03:47:57 瀏覽:906
shell腳本文件路徑 發布:2025-01-18 03:40:31 瀏覽:483
sql語句執行錯誤 發布:2025-01-18 03:21:49 瀏覽:651
資料庫雙引號 發布:2025-01-18 03:10:20 瀏覽:79
學java和php 發布:2025-01-18 03:01:03 瀏覽:452
怎麼開伺服器的埠 發布:2025-01-18 02:54:23 瀏覽:648
別克君越編程 發布:2025-01-18 02:32:24 瀏覽:914
ftp游戲下載網站 發布:2025-01-18 02:09:04 瀏覽:628
python調用另一個文件中的函數 發布:2025-01-18 02:03:54 瀏覽:597
mysql存儲html 發布:2025-01-18 01:57:24 瀏覽:129