《精通Unix下C语言编程与项目实践》之九
设计网页投票器 (一)
作者:朱云翔,胡平
15.5 项目:网页投票器――HTTP客户端
在互联网时代,很多服务程序采用了超文本传输协议HTTP进行报文传输,比如中国联合通信公司短消息网关系统接口协议中就提供了HTTP报文的接口协议,甚至有很多信息系统只支持HTTP模式的接口报文,比如在某些企信通接入网关等。因此在Unix下开发的C程序,就很有必要具备HTTP报文的组包、发送和接收功能。
读者们应该有过网上投票的经历,很多网站的投票是不限制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: */*
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对话。
《精通Unix下C语言编程与项目实践》之九
设计网页投票器 (一)
作者:朱云翔,胡平
15.5 项目:网页投票器――HTTP客户端
在互联网时代,很多服务程序采用了超文本传输协议HTTP进行报文传输,比如中国联合通信公司短消息网关系统接口协议中就提供了HTTP报文的接口协议,甚至有很多信息系统只支持HTTP模式的接口报文,比如在某些企信通接入网关等。因此在Unix下开发的C程序,就很有必要具备HTTP报文的组包、发送和接收功能。
读者们应该有过网上投票的经历,很多网站的投票是不限制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: */*
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对话。
本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/137734,如需转载请自行联系原作者