设计网页投票器(一)《精通Unix下C语言编程与项目实践》之九

简介:


《精通Unix下C语言编程与项目实践》之九

设计网页投票器 (一)
作者:朱云翔,胡平

15.5 项目:网页投票器――HTTP客户端

在互联网时代,很多服务程序采用了超文本传输协议HTTP进行报文传输,比如中国联合通信公司短消息网关系统接口协议中就提供了HTTP报文的接口协议,甚至有很多信息系统只支持HTTP模式的接口报文,比如在某些企信通接入网关等。因此在Unix下开发的C程序,就很有必要具备HTTP报文的组包、发送和接收功能。
读者们应该有过网上投票的经历,很多网站的投票是不限制IP的,因此为了获取一个靠前的排名,不少人在不辞辛劳的点击鼠标,当然也有部分所谓的“聪明人”选择使用投票软件或者网页刷新器。初次接触自动投票工具的用户很可能会惊叹于这些工具强大的投票功能,其实这些软件本质上就是一个HTTP客户端,它们编辑选手信息成URL并向网页服务器发送读取某个网页的请求,服务器接收请求执行该网页,该网页则自动为编辑的选手加票。

15.5.1 URLUniform Resource Locator,统一资源定位符)

URL就是我们在浏览器的地址栏里输入的网站地址,浏览器通过HTTPWeb服务器上站点的网页代码提取出来,并翻译成漂亮的网页。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*/*及其后的语句是实体头信息
注意在语句ConnectionKeep-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 URLUniform Resource Locator,统一资源定位符)

URL就是我们在浏览器的地址栏里输入的网站地址,浏览器通过HTTPWeb服务器上站点的网页代码提取出来,并翻译成漂亮的网页。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*/*及其后的语句是实体头信息
注意在语句ConnectionKeep-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,如需转载请自行联系原作者


相关文章
|
29天前
|
监控 网络协议 API
C语言系统编程
C语言系统编程
|
1月前
|
Linux C语言 开发者
Linux系统下C语言的高阶编程
Linux系统下C语言的高阶编程
15 0
|
1月前
|
存储 C语言 索引
掌握多维数组,让你的C语言编程技能暴涨!
掌握多维数组,让你的C语言编程技能暴涨!
|
18天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
1月前
|
自然语言处理 算法 搜索推荐
C语言的编程
C语言的编程
9 1
|
1月前
|
存储 C语言 索引
遍历一维数组C语言,掌握这个技能,你的编程能力直线上升!
遍历一维数组C语言,掌握这个技能,你的编程能力直线上升!
|
1月前
|
存储 C语言
3分钟搞定阶乘!C语言编程新手也能轻松学会的秘籍
3分钟搞定阶乘!C语言编程新手也能轻松学会的秘籍
|
存储 算法 C语言
C语言及程序设计[套餐]课程主页
  课程链接:http://edu.csdn.net/combo/detail/30,提供所有的视频和课件下载。   三部分的课程主页,提供了为每一课时配套的自测、示例下载,以及程序阅读、程序填空、实践项目、参考解答等。这是本课最具价值的部分,是保证学习效果的根本保证。请在看视频基础上,完成相关的实践。   这三部分的课程主页的链接分别是:【初步篇】、【提高篇】、【进阶篇】   本课QQ交流群
2062 0
|
9天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
18 0
|
20天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
23 0