文章試讀
不拘一個遍程序系列:編程序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四
職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟件人才 精力充沛與事業成功 讓系分來得更猛烈些吧 不值錢的系統分析師 經濟危機下大學生如何就業
我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌 香格裡拉美人圖
寶寶圖片:超可愛的小寶寶 寫博客
考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析 2008年12月程序員試題分析 2009年軟考備考全攻略 2008年5月程序員試題解析
《精通Unix下C語言編程與項目實踐》之十一
設計網頁刷新器
作者:朱雲翔,胡平
15.4.4 網頁刷新器
程序http1在訪問頁面上存在著如下不足:其一,只能根據IP地址而不能根據域名訪問網頁;其二,只能訪問一個特定的網頁;其三,只讀取一次WEB服務端返回的信息。事實上,在大多數頁面的響應報文中,實體內容項會有很多的內容,遠遠超過了一次recv調用能夠接收的范圍,因此客戶端必須反復調用recv直到信息接收完畢為止。
本處設計一個網頁刷新器,用戶將需要訪問的WEB服務器域名和網頁絕對路徑地址作為命令行參數輸入,如代碼15-17所示:
代碼15-17 網頁刷新器節自/code/chapter15/http2.c)
#include <comlib.h>
char buf2[]= /* 組裝HTTP協議GET請求報文 */
"GET %s 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: %s\r\n"
"Connection: Keep-Alive\r\n\r\n";
int main(int argc, char *argv[])
{
char buf[1024];
int nSock, i=9999, j=0;
struct hostent *host;
if (argc != 3) return 0;
/* 參數argv[1]是WEB服務器域名,域名轉主機地址 */
if ((host = gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
return 2;
}
fprintf(stderr, "%s\n", inet_ntoa(*((struct in_addr *)host->h_addr)));
/* 主機地址轉字符串IP地址,建立TCP連接,WEB端的端口號一般是80 */
ASSERT(ConnectSock(&nSock, 80, inet_ntoa(*((struct in_addr *)host->h_addr))) == 0);
/* 組建HTTP協議GET請求包 */
sprintf(buf, buf2, argv[2], argv[1]);
/* 發送HTTP協議GET請求報文 */
WriteFile(nSock, buf, strlen(buf));
fprintf(stderr, buf);
while (i > 0)
{ /* 反復接收套接字nSock上的信息,直到發生錯誤或接收不到信息為止 */
memset(buf, 0, sizeof(buf));
i = recv(nSock, buf, sizeof(buf), 0);
j = j + i;
fprintf(stderr, buf);
}
/* 中斷套接字連接 */
close(nSock);
PrintLog(stderr, "%d", j);
}
實踐經驗】函數sprintf的格式控制參數第二個參數)不一定必須為常量字符串,也可以為變量字符串,比如代碼15-17中的黑體語句中就使用了buf2作為格式控制字符串。
編譯代碼15-17:
# make http2
cc -o http2 http2.c -O -DUNIX -DDEBUG -DTRACE_FILE='"./trace"' -D__PATH__='"/"' -I/u/zyx/code/comlib/include -L/u/zyx/code/comlib/lib -lcom
運行代碼15-17:
例1. 訪問以下URL:
[url]http://publish.games.sina.com.cn/poll.php?p_id=560&t_id=1327[/url]
實現網頁投票器功能:
# http2 publish.games.sina.com.cn /poll.php?p_id=560&t_id=1327
例2. 訪問網頁“[url]www.csai.cn[/url]”:
# http2 [url]www.csai.cn[/url] /
注意】本節講述網頁刷新器的設計,目的只是為了向讀者闡述基於TCP連接的SOCKET客戶端程序的設計方法和域名轉化為IP地址的方法。請讀者妥善使用網頁刷新器,不要把它作為一種攻擊WEB端服務器流量的工具。
相關文章:
封面 前言 目錄 策劃 作者
動態庫 變長參數 文件鎖 外設 僵死進程
定時器 I/O重定向 消息隊列 共享內存
實踐項目:
開發網頁投票器一) 二)
開發網頁投票器
本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/138511