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

简介:
15.4.3 网页投票器
本处设计一个网页投票器,它访问“www.zhiliaowang.com”上的服务程序“/toupiaoceshi.asp”,并通过“name”参数向选手投票。如代码15-16所示:
代码15-16 网页投票器(节自/code/chapter15/http1.c
#include <comlib.h>
char buf2[]=            /* 组装HTTP协议GET请求报文 */
"GET /toupiaoceshi.asp?name=朱云翔 HTTP/1.0\r\n"
"Accept: */*\r\n"
"Accept-Language: zh-cn\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\r\n"
"Host: www.zhiliaowang.com\r\n"
"Connection: Keep-Alive\r\n\r\n";
int main()
{
    char buf[2048];
    int nSock;
    fprintf(stderr, "------------投票开始---------------\n");
    ASSERT(ConnectSock(&nSock, 80, "122.51.64.66")==0);/* 建立TCP连接 */
    WriteFile(nSock, buf2, strlen(buf2));               /* 发送GET请求 */
    fprintf(stderr, buf2);
    memset(buf, 0, sizeof(buf));
    recv(nSock, buf, sizeof(buf), 0);                   /* 接收GET请求 */
    fprintf(stderr, buf);
    close(nSock);                                       /* 释放TCP连接 */
    fprintf(stderr, "------------投票结束---------------\n");
}
其中\r\n是回车换行IP地址122.51.64.66是网站www.zhiliaowang.comIP地址读者可以通过执行ping命令从域名转换到IP地址
# ping www.zhiliaowang.com
PING www.zhiliaowang.com (122.51.64.66): 56 data bytes
64 bytes from 122.51.64.66: icmp_seq=0 ttl=127 time=20 ms
本处并没有使用套接字发送函数send,而是调用了封装write的函数WriteFile来发送GET请求,这说明底层文件编程库也能作用于套接字描述符,函数writeread也能实现套接字信息的发送和接收。
编译代码15-16
# make http1
        cc -o http1 http1.c -O -DUNIX -DDEBUG -DTRACE_FILE='"./trace"' -D__PATH__='"/"' -I/u/zyx/code/comlib/include  -L/u/zyx/code/comlib/lib  -lcom
运行代码15-16
# ./http1
------------投票开始---------------
GET /toupiaoceshi.asp?name=朱云翔 HTTP/1.0       /* 请求行 */
………………………………                                    /* 省略 */
HTTP/1.1 200 OK                                 /* 状态行 */
…………………………………                                   /* 省略 */
------------投票结束---------------
【实践经验】程序http2实现了向一个特定的WEB网页投票的功能,当WEB服务器、网页和参数发生变化,程序也必须做响应的改动。
1. 更改代码15-16,设计关于以下URL的自动投票程序:
http://publish.games.sina.com.cn/poll.php?p_id=560&t_id=1327
答:首先更改GET行常数为:
char buf2[]=
"GET /poll.php?p_id=560&t_id=1327 HTTP/1.1\n"
………………………………                                   
其次,更改报文头属性Host
"Host: publish.games.sina.com.cn\n"
最后更改TCP连接语句中的目的方IP地址即可:
ASSERT_NORMAL(ConnectSock(&nSock, 80, "202.108.43.242"));
【注意】本节讲述网页投票器的设计,其目的只是为了向读者阐述基于TCP连接的SOCKET程序设计方法,并不是号召大家在各类投票活动中作弊。选手的票数应该凭自己的真本领获取,而不能借助所谓的网页投票器,况且很多投票活动都限制了同一IP的投票时间间隔和投票次数,这些措施都极大限制了网页投票器的使用范围。

 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/138060,如需转载请自行联系原作者



相关文章
|
7天前
|
Unix Shell API
组合思维:Unix 哲学到底给现代编程带来哪些重要启示?
Unix哲学提供了一套简洁而强大的设计理念,这些理念在现代编程中依然具有重要的指导意义。通过模块化设计、组合工具、避免过早优化以及注重可复用性和可扩展性,开发者可以构建出更高效、更健壮的软件系统。希望本文能够帮助读者深入理解Unix哲学,并在实际开发中应用这些宝贵的设计原则。
40 25
|
3月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
84 8
|
4月前
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
111 5
|
4月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
110 4
|
5月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
891 12
|
5月前
|
算法 Unix 数据安全/隐私保护
Python编程--UNIX口令破解机
Python编程--UNIX口令破解机
45 1
|
6月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
6月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
Unix Shell Linux
《Linux/UNIX系统编程手册(上、下册)》——第1章 历史和标准 1.1UNIX和C语言简史
这一渊源使UNIX集多种开创性的特性于一身,但同时也带来了负面影响——随着时间的推移,UNIX的实现渐趋分裂。因此,要编写出能够运行于所有UNIX实现之上的应用程序愈发困难。这又导致了人们对UNIX实现的标准化呼声越来越高,本章的第二部分将讨论这一问题。
1824 0
|
2月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
73 23