亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網管 > 服務器 > 正文

實現web服務器中的gzip

2020-05-27 13:46:37
字體:
來源:轉載
供稿:網友

 web服務器實現壓縮數據發送給瀏覽器

web服務器使用gzip壓縮可以提高網站的響應速度,因為數據壓縮會消耗一定的cpu及I/O的。但是可以減少通過網絡傳輸的數據量。

從而提高網站的瀏覽速度本程序本人自己在ubuntu中編譯成功,在ubuntu中經過Firefox中,window 系統IE 8,Firefox、chrome中測試成功。

本程序需要用到zlib壓縮類庫,沒有裝將無法成功,本人只提供在ubuntu中的代碼及運行方式。希望大家諒解。關于用到的

zlib庫中的知識,稍后會出新的博客做解釋,關于gzip壓縮的頭部請看另外一篇博客 gzip頭部格式。

源碼及makefile下載地址:http://pan.baidu.com/share/link?shareid=167795&uk=2181414688

直接給大家上源代碼。下面為源代碼。(如有任何問題,希望大家指出來了)

/* *主要實現功能,對傳輸的數據使用gzip進行壓縮了*1.實現綁定本機機器的1024端口作為ReageWeb服務提供網頁服務的端口。(避免與機器上裝有web服務器產生端口沖突)* 作者:Reage* blog:http://blog.csdn.net/rentiansheng*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#include <string.h>#include <sys/stat.h>#include <signal.h>#include <stdio.h>#include <string.h>#include <assert.h>#include <zlib.h>#define OS_CODE 0x03 /*Unix OS_CODE*/#define DEFAULT_COMPRESSION Z_DEFAULT_COMPRESSION#define DEFAULT_WINDOWSIZE -15#define DEFAULT_MEMLEVEL 9#define DEFAULT_BUFFERSIZE 8096#define MAX 1024#define METHOD 20 //獲取數據的方式,使用字符串的長度#define URI 255 //表示URI的最大長度#define VERSION 15 //HTTP版本好的最大長度#define TYPE 20 //表示文件的類型的長度int res_socket;void app_exit();static const char gzip_header[10] = {37, 213, Z_DEFLATED, 0, 0, 0, 0, 0, 0, OS_CODE};void put_long (unsigned char *string, unsigned long x) { string[0] = (x & 0xff); string[1] = ((x >> 8) & 0xff) ; string[2] = ((x >> 16) & 0xff) ; string[3] = ((x >> 24) & 0xff);}/*@description:將數據使用gzip壓縮后發給瀏覽器@parametersockd:套接字file: 要壓縮的內容了*/int gzip_buffer (int sockd, char * msg, int len) { z_stream stream;//zlib使用的。 int ret, flush; char in[MAX];//存放輸入的數據 char send[MAX + 18 ];//存放壓縮過后的數據 unsigned have; memcpy (send, gzip_header, 10); memset (in, 0, len); stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = 0; stream.next_in = Z_NULL; memcpy (in, msg, len); //壓縮初始化。 int tmp_result = deflateInit2(&stream, Z_DEFAULT_COMPRESSION,//壓縮級別 Z_DEFLATED,//壓縮方式 -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); if (Z_OK != tmp_result) { printf("deflateInit error: %drn", tmp_result); return 0; } stream.avail_in = len; //要壓縮數據的長度 stream.next_in = in; //要壓縮數據的首地址 stream.avail_out = MAX; //可存放的最大輸出結果的長多。就是壓縮后數據的最大長度 stream.next_out = send + 10; //存放壓縮數據的開始位置,send前十個字節用來放頭部 ret = deflate (&stream,Z_FINISH); //壓縮 assert (ret != Z_STREAM_ERROR); switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd (&stream); return ret; } have = MAX - stream.avail_out; unsigned crc = crc32(0L, in, len); char * tail = send + 10 + have; put_long (tail, crc); put_long (tail + 4, len); write (sockd, send, have + 18); deflateEnd (&stream); return 1;}/* @description:開始服務端監聽@parameterip:web服務器的地址port:web服務器的端口@result:成功返回創建socket套接字標識,錯誤返回-1*/int socket_listen( char *ip, unsigned short int port){ int res_socket; //返回值 int res, on; struct sockaddr_in address; struct in_addr in_ip; res = res_socket = socket(AF_INET, SOCK_STREAM, 0); setsockopt(res_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); memset(&address, 0, sizeof(address)); address.sin_family = AF_INET ; address.sin_port =htons(port); address.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1"); res = bind( res_socket, (struct sockaddr *) &address, sizeof( address ) ); if(res) { printf( "port is used , not to repeat bindn" ); exit(101); }; res = listen(res_socket,5); if(res) { printf( "listen port is error ;n" ); exit( 102 ); }; return res_socket ;}/*@description:向客戶端發送網頁頭文件的信息@parameterconn_socket:套接字描述符。status:http協議的返回狀態碼。@s_status:http協議的狀態碼的含義@filetype:向客戶端發送的文件類型*/void send_http_head(int conn_socket){ char buf[MAX]; memset(buf, 0, MAX); sprintf(buf, "HTTP/1.0 %d OKrn", 200); sprintf(buf, "%sServer: Reage Web Serverrn", buf); sprintf(buf, "%sContent-Type: text/htmlrn", buf); sprintf(buf, "%sContent-Encoding: gziprnrn", buf); write(conn_socket, buf, strlen(buf));} int main(int argc, char * argv[] ){ int conn_socket; int tmp ; int line ; struct sockaddr_in client_addr; char buf[MAX]; int len = sizeof(client_addr); char method[METHOD], uri[MAX], version[VERSION], type[TYPE]; char msg[] = "<br><br><h1>Reage Web Server gzip support text!</h1><br/><h1><a href = "http://blog.csdn.net/rentiansheng">Reage blog</a>"; res_socket = socket_listen( "127.0.0.1", 1024) ; //當按ctrl+c結束程序時調用,使用app_exit函數處理退出過程 signal(SIGINT, app_exit); while(1){ conn_socket = accept( res_socket, (struct sockaddr * )&client_addr, &len ); printf("reagen"); tmp = read (conn_socket, buf, MAX-1); buf [MAX - 1] = 0; send_http_head(conn_socket); gzip_buffer (conn_socket, msg, strlen(msg)); close(conn_socket); } }void app_exit(){ //回復ctrl+c組合鍵的默認行為 signal (SIGINT, SIG_DFL); //關閉服務端鏈接、釋放服務端ip和端口 close(res_socket); printf("n"); exit(0);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文精品99久久国产香蕉| 精品香蕉在线观看视频一| 亚洲白虎美女被爆操| 欧美午夜视频一区二区| 亚洲欧美制服综合另类| 亚洲第一二三四五区| 欧美性高跟鞋xxxxhd| 亚洲电影免费观看高清完整版| 国产欧美日韩精品在线观看| 精品久久久中文| 国产精品扒开腿做| 日日摸夜夜添一区| 日本亚洲欧洲色α| 国产精品999| 日韩在线不卡视频| 欧美孕妇与黑人孕交| 成人黄色免费在线观看| 国产精品一区久久久| 中文字幕日韩专区| 亚洲精品视频在线观看视频| 欧美裸体xxxx极品少妇软件| 91亚洲精华国产精华| 国产成人精品免费视频| 日韩av电影免费观看高清| 亚洲欧美激情精品一区二区| 国内免费精品永久在线视频| 久久久久免费视频| 大胆人体色综合| 九九视频直播综合网| 国产精品人人做人人爽| 日韩在线观看网址| 欧美—级高清免费播放| 国产一区二区成人| 97成人精品视频在线观看| 国产精品9999| 毛片精品免费在线观看| 久久精品影视伊人网| 欧美日韩中国免费专区在线看| 亚洲精品国产精品久久清纯直播| 亚洲视频在线播放| 国产精品流白浆视频| 欧美亚洲国产视频小说| 日韩欧美亚洲一二三区| 成人黄色av免费在线观看| 琪琪亚洲精品午夜在线| 久热国产精品视频| 亚洲欧美一区二区精品久久久| 美女扒开尿口让男人操亚洲视频网站| 久久精品国产亚洲7777| 国产精品中文久久久久久久| 91豆花精品一区| 国产性色av一区二区| 欧洲s码亚洲m码精品一区| www.日韩不卡电影av| 一区二区在线视频播放| 久久亚洲精品成人| 欧美午夜www高清视频| 国产精品第2页| 欧美大成色www永久网站婷| 久久综合伊人77777尤物| 亚洲精品国产精品乱码不99按摩| 亚洲福利视频二区| 久久久久久久久久av| 91国内产香蕉| 欧美大片免费观看在线观看网站推荐| 国产福利视频一区二区| 精品亚洲一区二区三区四区五区| 欧美日韩激情视频8区| 国产精品18久久久久久首页狼| 九九久久综合网站| 国产精品永久免费在线| 国产精品一区二区久久久久| 国产免费观看久久黄| 日本免费久久高清视频| 欧美高清无遮挡| 色爱精品视频一区| 日韩av综合中文字幕| 一区二区三区视频在线| 国产精品电影观看| 亚洲成人av在线| 亚洲三级黄色在线观看| 久久精品人人做人人爽| 伊人精品在线观看| 久久久精品国产亚洲| 91久久久精品| 欧美激情视频一区| 国产视频精品久久久| 欧美专区国产专区| 91精品国产91久久久久| 欧美寡妇偷汉性猛交| 正在播放欧美视频| 狠狠色狠狠色综合日日五| 欧美激情精品久久久久久黑人| 奇米成人av国产一区二区三区| 国内成人精品一区| 亚洲国产日韩欧美在线动漫| 亚洲香蕉伊综合在人在线视看| 国产精品69久久久久| 国产v综合ⅴ日韩v欧美大片| 日韩欧美国产免费播放| 狠狠久久亚洲欧美专区| 欧美成人一区二区三区电影| 国产91在线播放九色快色| 久久视频在线看| 久久精品国产一区二区电影| 日韩av在线一区二区| 精品中文字幕视频| 色伦专区97中文字幕| 麻豆一区二区在线观看| 亚洲人成电影网| 亚洲性69xxxbbb| 日本久久中文字幕| 国产精品18久久久久久首页狼| 久久精品99久久香蕉国产色戒| 97国产精品人人爽人人做| 韩国一区二区电影| 欧美视频中文在线看| 久久精品国产v日韩v亚洲| 久久中文字幕视频| 亚洲欧洲成视频免费观看| 欧美性一区二区三区| 国产日韩综合一区二区性色av| 久久不射热爱视频精品| 国产99久久精品一区二区永久免费| 亚洲日韩欧美视频一区| 亚洲欧美激情一区| 国产精品久久一区主播| 91在线观看免费高清完整版在线观看| 日韩av免费在线看| 亚洲国产成人在线视频| 久久久亚洲福利精品午夜| 中文字幕亚洲字幕| 国产日韩欧美在线视频观看| 欧美视频免费在线观看| 日本久久久久亚洲中字幕| 欧美一区二区大胆人体摄影专业网站| 欧美日韩国产一中文字不卡| 国产午夜精品全部视频在线播放| 国产亚洲人成网站在线观看| 欧美激情区在线播放| 欧美高清理论片| 亚洲精品网站在线播放gif| 日韩经典中文字幕| 自拍偷拍亚洲精品| 亚洲一区二区三区香蕉| 日韩久久精品成人| 国产一区二区欧美日韩| 大荫蒂欧美视频另类xxxx| 欧美一区亚洲一区| 久久久久久久久久久网站| 国产精品视频区1| 国产精品亚洲综合天堂夜夜| 中文字幕亚洲欧美日韩在线不卡| 亚洲免费视频网站| 国产精品三级久久久久久电影| 亚洲国产美女久久久久| 国产精品美乳在线观看| 日本不卡高字幕在线2019| 福利二区91精品bt7086| 欧美一二三视频| 久久亚洲国产精品| 中文字幕欧美专区| 国产精品福利在线观看网址| 亚洲成人av资源网|