设计网页投票器(一)《精通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,如需转载请自行联系原作者


相关文章
|
1月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
165 12
|
1月前
|
算法 Unix 数据安全/隐私保护
Python编程--UNIX口令破解机
Python编程--UNIX口令破解机
|
2月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
2月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
2月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
2月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
6月前
|
C语言
c语言编程练习题:7-10 算术入门之加减乘除
对于输入的两个整数,按照要求输出其和差积商。
118 0
|
12月前
|
存储 C语言 数据格式
【手把手带你刷题】-C语言编程入门篇(四)
【手把手带你刷题】-C语言编程入门篇(四)
71 0
下一篇
无影云桌面