1.实现web服务器中的获取获gzip
2.å¦ä½è§£å³httpå°å
ä¸gzipç¼ç çhtml
实现web服务器中的gzip
web服务器实现压缩数据发送给浏览器
web服务器使用gzip压缩可以提高网站的响应速度,因为数据压缩会消耗一定的源码源码cpu及I/O的。但是工具可以减少通过网络传输的数据量。
从而提高网站的获取获班级网站源码编辑浏览速度
本程序本人自己在ubuntu中编译成功,在ubuntu中经过Firefox中,源码源码window 系统IE 8,工具积分查询系统源码Firefox、获取获chrome中测试成功。源码源码
本程序需要用到zlib压缩类库,工具没有装将无法成功,获取获本人只提供在ubuntu中的源码源码代码及运行方式。希望大家谅解。工具关于用到的获取获教务系统3.8源码
zlib库中的知识,稍后会出新的源码源码博客做解释,关于gzip压缩的工具头部请看另外一篇博客 gzip头部格式。
源码及makefile下载地址:tl.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 0x /*Unix OS_CODE*/#define DEFAULT_COMPRESSION Z_DEFAULT_COMPRESSION#define DEFAULT_WINDOWSIZE -#define DEFAULT_MEMLEVEL 9#define DEFAULT_BUFFERSIZE #define MAX #define METHOD //获取数据的坚持住 牛郎 源码方式,使用字符串的长度#define URI //表示URI的最大长度#define VERSION //HTTP版本好的最大长度#define TYPE //表示文件的类型的长度int res_socket;void app_exit();static const char gzip_header[] = { '', '', 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 ) 0xff) ; string[3] = ((x ) 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 + ];//存放压缩过后的数据 unsigned have; memcpy (send, gzip_header, ); 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 + ; //存放压缩数据的开始位置,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 = crc(0L, in, len); char * tail = send + + have; put_long (tail, crc); put_long (tail + 4, len); write (sockd, send, have + ); 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(".0.0.1"); res = bind( res_socket, (struct sockaddr *) address, sizeof( address ) ); if(res) { printf( "port is used , not to repeat bindn" ); exit(); }; res = listen(res_socket,5); if(res) { printf( "listen port is error ;n" ); exit( ); }; return res_socket ;}/*@description:向客户端发送网页头文件的信息@parameterconn_socket:套接字描述符。status:/rentiansheng"Reage blog/a"; res_socket = socket_listen( ".0.0.1", ) ; //当按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);}
å¦ä½è§£å³httpå°å ä¸gzipç¼ç çhtml
ããå¦ä½è§£å³httpå°å ä¸gzipç¼ç çhtml
ãã大家é½ç¥éï¼å¨é»è®¤æ¨¡å¼ä¸ï¼httpåè®®ä¸åéçç½é¡µçHtml代ç æ¯ç»è¿gzipç¼ç åä¼ éçãé£ä¹æ们æä¹æè½åå¤è¿æ®µç¼ç åçhtmlå¢ï¼
ãã大家å¯è½é½ç¥élinuxä¸æä¸ä¸ªgzipå½ä»¤ãå¯ä»¥ææ件å缩ægzipç¼ç çæ ¼å¼ï¼å³*.gz
ããè对äºæ件çå缩å解å缩ï¼å¯ä»¥éç¨zlibåºä¸æä¾çåç§æ¥å£æ¥è¿è¡æä½ãä½æ¯è¿éé®é¢æ¥äºãå ³äºgzipç¼ç çé£äºå½æ°é½å¸¦ægzå¼å¤´çæ 示ãèè¿äºæ¥å£ç»´æ¤äºä¸ä¸ªåå«gz_streamçç»æä½ã并ä¸æ¯é对æ件FILE*æä½çã
ããèæ们è¦è§£å³çé®é¢æ¯ï¼æ们ææªåçå°å ä¸çgzipç¼ç çå 容æ¿åºæ¥ï¼æ¾å°ä¸ä¸ªbufferä¸ãé£ä¹æä¹æè½é对è¿ä¸ªbufferä¸çæ°æ®åºç¨è¿äºæ¥å£å¢ï¼
ããææ¬æ¥çæ³æ³æ¯è½ä¸è½å¨è¿äºæ¥å£ä¸æ¾å°ä¸é¨å¯¹å åä¸çæ°æ®è¿è¡è§£ç ï¼
ããèèè¿ä¸ªé®é¢ï¼æçäºè¿ä¸ªåºçæºä»£ç ãåæ¥æ¾å¼äºãè³äºæ¾å¼çåå ï¼å¯è½æ¯ææå¿åä¸å¤ï¼æè ä¸æ³çé£äºæºä»£ç äºãæ»ä¹ï¼æçäºä¸å¤©ï¼ççæ头ç¼ã
ããåæ¥æå°±æ³ä¸ªåæ³ç»å¼è¿ä¸æè·¯ï¼èµ°ä¸ªå¼¯è·¯ãé®é¢è±ç¶å¼æã
ããæè·¯å¦ä¸ï¼
ãã1. æè·åå°çç»è¿ç¼ç çæ°æ®ä¿åå°ä¸ä¸ªæ件ä¸ã注æåæ件çæ¶åä¸å®è¦ä»¥äºè¿å¶æ¹å¼ãå¦åæ¯ä¸è½è§£ç çã
ãã2. åºç¨zlibä¸çæ¥å£ï¼gzopen(),gzread(),gzclose()å³å¯å®æ解ç çä»»å¡äºã