文章試讀 | 不拘一個遍程式系列:程式設計式不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四 職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟體人才 精力充沛與事業成功 讓系分來得更猛烈些吧 不值錢的系統分析師 經濟危機下大學生如何就業 我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌 香格裡拉美人圖 寶寶圖檔:超可愛的小寶寶 寫部落格 考試教育訓練:主要是關于考研、軟考和等級的相關題解。2009考研試題分析 2008年12月程式員試題分析 2009年軟考備考全攻略 2008年5月程式員試題解析 |
《精通Unix下C語言程式設計與項目實踐》之九 設計網頁投票器 (一) 作者:朱雲翔,胡平
15.5 項目:網頁投票器――HTTP用戶端
在網際網路時代,很多服務程式采用了超文本傳輸協定HTTP進行封包傳輸,比如中國聯合通信公司短消息網關系統接口協定中就提供了HTTP封包的接口協定,甚至有很多資訊系統隻支援HTTP模式的接口封包,比如在某些企信通接入網關等。是以在Unix下開發的C程式,就很有必要具備HTTP封包的組包、發送和接收功能。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
讀者們應該有過網上投票的經曆,很多網站的投票是不限制IP的,是以為了擷取一個靠前的排名,不少人在不辭辛勞的點選滑鼠,當然也有部分所謂的“聰明人”選擇使用投票軟體或者網頁重新整理器。初次接觸自動投票工具的使用者很可能會驚歎于這些工具強大的投票功能,其實這些軟體本質上就是一個HTTP用戶端,它們編輯選手資訊成URL并向網頁伺服器發送讀取某個網頁的請求,伺服器接收請求執行該網頁,該網頁則自動為編輯的選手加票。
15.5.1 URL(Uniform Resource Locator,統一資源定位符)
URL就是我們在浏覽器的位址欄裡輸入的網站位址,浏覽器通過HTTP将Web伺服器上站點的網頁代碼提取出來,并翻譯成漂亮的網頁。URL中可以指定WEB站點名稱、網頁名稱,也可以向通路的網頁送出不同的參數,WEB端的投票服務程式正是利用了URL中的參數達到了區分選手并為選手加票的目的,比如以下URL就是一個投票的例子:
http://www.zhiliaowang.com/toupiaoceshi.asp?name=zyx
其中:
(1) “http://”代表超文本傳輸協定,通知網頁浏覽器(如IE等)顯示Web頁,通常不用輸入。
(2) “www.zhiliaowang.com”是裝有網頁的伺服器的域名,或站點伺服器的名稱。
(3) “/toupiaoceshi.asp”是伺服器端的投票服務程式的絕對路徑的名稱,“/”為根目錄。
(4) “?”代表後面接着參數。
(5) “name= zyx”辨別了一個參數name,它的值是“zyx”。在投票服務程式中,選手的姓名或編号等資訊一般通過參數傳入,不同的投票服務程式的參數的設定都不一樣,讀者要根據具體情況具體分析,本處URL的含義是為姓名叫“zyx”的選手投票。
15.5.2 HTTP協定封包格式
接下來我們看看HTTP協定(Hypertext Transfer Protocol――超文本傳輸協定)浏覽器端(用戶端)向WEB伺服器端通路頁面的過程和HTTP協定封包的格式。
基于HTTP協定的客戶機通路包括4個過程,分别是建立TCP套接字連接配接、發送HTTP請求封包、接收HTTP應答封包和關閉TCP套接字連接配接:
1. 建立TCP套接字連接配接
用戶端與WEB伺服器建立TCP套接字連接配接,其中WEB端伺服器的位址可以通過域名解析确定,WEB端的套接字偵聽端口一般是80。
2. 發送HTTP請求封包
用戶端向WEB服務端發送請求封包,HTTP協定的請求封包格式為:
請求消息 = 請求行(實體頭資訊) CRLF[ 實體内容 ]
請求行 = 方法 URL HTTP 版本号 CRLF
方法 = GET|HEAD|POST| 擴充方法
URL = 協定名稱 + 宿主名 + 目錄與檔案名
其中“CRLF”表示回車換行。
“請求行”中的“方法”描述了對指定資源執行的動作,常用的方法“GET”、“HEAD”和“POST”等3種,它們的含義如表15-8所示:
表 15-8 HTTP 請求方法
取值 | 描述 |
GET | 從 WEB 伺服器中擷取對象,不同類型的對象将擷取不同的資訊,比如: · 檔案類型對象,擷取該檔案的内容。 · 程式類型對象,擷取該程式執行的結果。 · 資料庫查詢類型對象,擷取該查詢的結果。 |
HEAD | 要求伺服器查找對象的元資訊。 |
POST | 從用戶端向 WEB 伺服器發送資料。 |
“實體頭資訊”中記載了封包的屬性,利用這些資訊可以實作用戶端與WEB伺服器之間的請求或應答,它包括封包的資料類型、壓縮方法、語言、長度、壓縮方法、最後一次修改時間、資料有效期等資訊。
實體内容是封包傳送的附加資訊,一般供POST請求填寫。
GET請求封包例子
一個URL為“http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱雲翔”的GET請求封包例子如下:
GET http://www.zhiliaowang.com/toupiaoceshi.asp?name= 朱雲翔 HTTP/1.1
Accept: **”及其後的語句是“實體頭資訊”。
注意:在語句“Connection:Keep-Alive”下的空行是必須的。
POST請求封包例子
下面是HTTP協定中關于POST請求封包例子,節自《中國聯合通信公司短消息網關系統接口協定(SGIP)》V1.2版:
POST /sp.cgi HTTP/1.0
Host: www.spserver.com
Authorization: Basic <Base64 串 >
Content-Length: <Content-Length>
<CommandId>=<4>
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=<ABCD 1234>
一般情況下,采用POST封包傳送資訊的資料存儲在“實體”部分中。
3. 接收HTTP應答封包
WEB伺服器處理客戶請求,并向客戶機發送應答封包,HTTP協定的應答封包格式為:
應答封包 = 狀态行(實體頭資訊) CRLF [ 實體内容 ]
狀态行 = HTTP 版本号 狀态碼 原因叙述
狀态碼描述了WEB伺服器執行客戶機請求的狀态資訊,其取值含義如表15-8所示:
表 15-8 HTTP 應答響應碼含義
取值 | 描述 |
1×× | 保留。 |
2×× | 成功接收,比如“ 200 ”表示處理成功。 |
3×× | 客戶需進一步細化請求。 |
4×× | 客戶錯誤,比如“ 404 ”表示通路的指定資源不存在。 |
5×× | 伺服器錯誤。 |
GET應答封包例子
一個請求URL為“http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱雲翔”的應答封包例子如下:
HTTP/1.1 200 OK
Connection: keep-alive
Date: Thu, 26 Jul 2007 14:00:02 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 190
Content-Type: text/html
Set-Cookie: ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB; path=/
Cache-control: private
<html>
<head>
<title> 精通 Unix 下 C 語言程式設計 </title>
</head>
<body>
<b> 精通 Unix 下 C 語言程式設計與項目實戰 <br></b>
<b> 投票測試 <br></b>
感謝你為選手
朱雲翔
投票 !
</body>
</html>
語句“HTTP/1.1 200 OK”中,“200”是響應碼,“OK”是原因描述。
POST應答封包例子
下面是HTTP協定中關于POST應答封包例子,節自《中國聯合通信公司短消息網關系統接口協定(SGIP)》V1.2版:
HTTP/1.0 200 OK
Date: Tue, 13 Mar 2001 02:45:12 GMT
Server: Apache/1.3.12 (Unix)
Content-Type: text/html
Connection: close
<CommandId>=<80000004>
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=< EFGH 5678> <Result>=<0>
一般情況下,POST應答封包的“實體”部分存儲實際傳輸的資訊。
4. 關閉TCP套接字連接配接
客戶機與伺服器雙方關閉套接字連接配接,結束TCP/IP對話。
相關文章: 封面 前言 目錄 策劃 作者 動态庫 變長參數 檔案鎖 外設 僵死程序 定時器 I/O重定向 消息隊列 共享記憶體 實踐項目: 開發網頁投票器(一) (二) 開發網頁投票器