文章試讀
不拘一個遍程序系列:編程序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四
職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟件人才 精力充沛與事業成功 讓系分來得更猛烈些吧 不值錢的系統分析師 經濟危機下大學生如何就業
我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌 香格裡拉美人圖
寶寶圖片:超可愛的小寶寶 寫博客
考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析 2008年12月程序員試題分析 2009年軟考備考全攻略 2008年5月程序員試題解析
《精通Unix下C語言編程與項目實踐》之九
設計網頁投票器 一)
作者:朱雲翔,胡平
15.5 項目:網頁投票器――HTTP客戶端
在互聯網時代,很多服務程序采用了超文本傳輸協議HTTP進行報文傳輸,比如中國聯合通信公司短消息網關系統接口協議中就提供了HTTP報文的接口協議,甚至有很多信息系統只支持HTTP模式的接口報文,比如在某些企信通接入網關等。因此在Unix下開發的C程序,就很有必要具備HTTP報文的組包、發送和接收功能。
讀者們應該有過網上投票的經歷,很多網站的投票是不限制IP的,因此為了獲取一個靠前的排名,不少人在不辭辛勞的點擊鼠標,當然也有部分所謂的“聰明人”選擇使用投票軟件或者網頁刷新器。初次接觸自動投票工具的用戶很可能會驚歎於這些工具強大的投票功能,其實這些軟件本質上就是一個HTTP客戶端,它們編輯選手信息成URL並向網頁服務器發送讀取某個網頁的請求,服務器接收請求執行該網頁,該網頁則自動為編輯的選手加票。
15.5.1 URLUniform 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: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: www.zhiliaowang.com
Connection: Keep-Alive
其中“/toupiaoceshi.asp?name=朱雲翔”是URL信息,語句“ACCEPT:*/*”及其後的語句是“實體頭信息”。
注意:在語句“Connection:Keep-Alive”下的空行是必須的。
POST請求報文例子
下面是HTTP協議中關於POST請求報文例子,節自《中國聯合通信公司短消息網關系統接口協議(SGIP)》V1.2版:
POST /sp.cgi HTTP/1.0 /* 請求行,服務程序為sp.cgi */
Host: www.spserver.com /* 以下為實體頭信息 */
Authorization: Basic <Base64 串>
Content-Length: <Content-Length>
<CommandId>=<4> /* 以下為POST請求的實體信息 */
<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> /* 以下為POST應答的實體信息 */
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=< EFGH 5678> <Result>=<0>
一般情況下,POST應答報文的“實體”部分存儲實際傳輸的信息。
4. 關閉TCP套接字連接
客戶機與服務器雙方關閉套接字連接,結束TCP/IP對話。
相關文章:
封面 前言 目錄 策劃 作者
動態庫 變長參數 文件鎖 外設 僵死進程
定時器 I/O重定向 消息隊列 共享內存
實踐項目:
開發網頁投票器一) 二) 開發網頁投票器
本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/137734