本处设计一个网页投票器,它访问“
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.com
”
的
IP
地址
,
读者可以通过执行
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
请求,这说明底层文件编程库也能作用于套接字描述符,函数
write
和
read
也能实现套接字信息的发送和接收。
编译代码
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
的投票时间间隔和投票次数,这些措施都极大限制了网页投票器的使用范围。