亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tmhttpd.c

?? WEB服務器,實現簡單的HTTP功能
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**
 * TieMa(Tiny&Mini) Http Server 
 * Copyright (C) 2008 heiyeluren. All rights reserved.
 *
 * tmhttpd is a mini open-source web server, mainly used in html/js/cs/images, 
 * such as static resources to provide services on the web. 
 * 
 * Use and distribution licensed under the BSD license.  See
 * the LICENSE file for full text.
 *
 * To learn more open-source code, visit: http://heiyeluren.googlecode.com
 * My blog: http://blog.csdn.net/heiyeshuwu
 *
 * $Id: tmhttpd.d 2008-6-12, 2008-6-22 04:42 heiyeluren $
 */

#include "tmhttpd.h"

/* default configure */
static unsigned short g_is_debug	= IS_DEBUG;
static unsigned short g_is_daemon	= IS_DAEMON;
static unsigned short g_is_browse	= IS_BROWSE;
static unsigned short g_is_log		= IS_LOG;
static unsigned int g_port			= DEFAULT_HTTP_PORT;
static unsigned int g_max_client	= DEFAULT_MAX_CLIENT;
static char g_dir_index[32]			= DEFAULT_DIRECTORY_INDEX;
static char g_doc_root[256]			= DEFAULT_DOCUMENT_ROOT; 
static char g_log_path[256]			= DEFAULT_LOG_PATH;

/* Global variable */
static int g_log_fd					= 0;



/********************************
 *
 *   Http Server Basic Function
 *
 ********************************/

/**
 * Die alert message
 *
 */
void die(char *mess){
    perror(mess); 
    exit(1); 
}

/**
 * substr - Sub string from pos to length
 *
 */
static char *substr( const char *s, int start_pos, int length, char *ret ){
    char buf[length+1];
    int i, j, end_pos;
	int str_len = strlen(s);

    if (str_len <= 0 || length < 0){
		return "";        
	}
	if (length == 0){
		length = str_len - start_pos;
	}
	start_pos = ( start_pos < 0 ? (str_len + start_pos) : ( start_pos==0 ? start_pos : start_pos-- ) );
	end_pos = start_pos + length;

    for(i=start_pos, j=0; i<end_pos && j<=length; i++, j++){
		buf[j] = s[i];        
	}
    buf[length] = '\0';
    strcpy(ret, buf);

    return(ret);
}

/**
 * explode -  separate string by separator
 *
 * @param string from - need separator 
 * @param char delim - separator
 * @param pointarray to - save return separate result
 * @param int item_num - return sub string total
 * 
 * @include stdlib.h 
 * @include string.h
 *
 * @example
 * char *s, **r;
 * int num;
 * explode(s, '\n', &r, &num);
 * for(i=0; i<num; i++){
 *     printf("%s\n", r[i]);
 * }
 * 
 */
static void explode(char *from, char delim, char ***to, int *item_num){
    int i, j, k, n, temp_len;
    int max_len = strlen(from) + 1;
    char buf[max_len], **ret;
       
    for(i=0, n=1; from[i]!='\0'; i++){
        if (from[i] == delim) n++;
    }
    
    ret = (char **)malloc(n*sizeof(char *));
    for (i=0, k=0; k<n; k++){
        memset(buf, 0, max_len);     
        for(j=0; from[i]!='\0' && from[i]!=delim; i++, j++) buf[j] = from[i];
        i++;
        temp_len = strlen(buf)+1;
        ret[k] = malloc(temp_len);
        memcpy(ret[k], buf, temp_len);
    } 
    *to = ret;
    *item_num = n;
}

/**
 * strtolower - string to lowner
 *
 */
static char *strtolower( char *s ){
	int i, len = sizeof(s);
	for( i = 0; i < len; i++ ){
		s[i] = ( s[i] >= 'A' && s[i] <= 'Z' ? s[i] + 'a' - 'A' : s[i] );
	}
	return(s);
}

/**
 * strtoupper - string to upper
 *
 */
static char *strtoupper( char *s ){
	int i, len = sizeof(s);
	for( i = 0; i < len; i++ ){
		s[i] = ( s[i] >= 'a' && s[i] <= 'z' ? s[i] + 'A' - 'a' : s[i] );
	}
	return(s);
}

/**
 * strpos - find char at string position
 *
 */
static int strpos (const char *s, char c){
	int i, len;
	if (!s || !c) return -1;
	len = strlen(s);
	for (i=0; i<len; i++){
		if (s[i] == c) return i;
	}
	return -1;	
}

/**
 * strrpos - find char at string last position
 *
 */
static int strrpos (const char *s, char c){
	int i, len;
	if (!s || !c) return -1;
	len = strlen(s);
	for (i=len; i>=0; i--){
		if (s[i] == c) return i;
	}
	return -1;
}




/**
 * trim - strip left&right space char
 *
 */
static char *trim( char *s ){   
    int l;   
    for( l=strlen(s); l>0 && isspace((u_char)s[l-1]); l-- ){
		s[l-1] = '\0';   
	}
    return(s);   
}   


/**
 * ltrim - strip left space char
 *
 */
static char *ltrim( char *s ){   
    char *p;   
    for(p=s; isspace((u_char)*p); p++ );   
    if( p!=s ) strcpy(s, p);   
    return(s);   
}   


/**
 *  filesize - get file size
 */
static long filesize(const char *filename){
    struct stat buf;
    if (!stat(filename, &buf)){
        return buf.st_size;
    }
    return 0;
}

/**
 * file_exists - check file is exist
 */
static int file_exists(const char *filename){
    struct stat buf;
    if (stat(filename, &buf) < 0){
        if (errno == ENOENT){
            return 0;
        }
    }
    return 1;
}

/**
 * file_get_contents - read file contents
 *
 */
static int file_get_contents( const char *filename, size_t filesize, char *ret, off_t length ){
	if ( !file_exists(filename) || access(filename, R_OK)!=0 )	return -1;

	int fd;
	char buf[filesize];

	if ( (fd = open(filename, O_RDONLY)) == -1) return -1;
	length = ( length > 0 ? length : filesize);
	read(fd, buf, length);
	strcpy(ret, buf);
	close(fd);

	return 0;
}

/**
 * is_dir - check file is directory
 * 
 */
static int is_dir(const char *filename){
	struct stat buf;
	if ( stat(filename, &buf) < 0 ){
		return -1;
	}
	if (S_ISDIR(buf.st_mode)){
		return 1;
	}
	return 0;
}

/**
 * is_file - check file is regular file
 * 
 */
static int is_file(const char *filename){
	struct stat buf;
	if ( stat(filename, &buf) < 0 ){
		return -1;
	}
	if (S_ISREG(buf.st_mode)){
		return 1;
	}
	return 0;
}

/**
 * Fetch current date tme
 *
 */
static void getdate(char *s){
	char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
	time_t timep;
	struct tm *p;

	time(&timep);
	p = localtime(&timep);
	sprintf(s, "%d-%d-%d %d:%d:%d",(1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
} 

/**
 * Get MIME type header
 *
 */
static void mime_content_type( const char *name, char *ret ){
    char *dot, *buf; 

    dot = strrchr(name, '.'); 

	/* Text */
    if ( strcmp(dot, ".txt") == 0 ){
        buf = "text/plain";
    } else if ( strcmp( dot, ".css" ) == 0 ){
        buf = "text/css";
    } else if ( strcmp( dot, ".js" ) == 0 ){
        buf = "text/javascript";
    } else if ( strcmp(dot, ".xml") == 0 || strcmp(dot, ".xsl") == 0 ){
        buf = "text/xml";
    } else if ( strcmp(dot, ".xhtm") == 0 || strcmp(dot, ".xhtml") == 0 || strcmp(dot, ".xht") == 0 ){
        buf = "application/xhtml+xml";
    } else if ( strcmp(dot, ".html") == 0 || strcmp(dot, ".htm") == 0 || strcmp(dot, ".shtml") == 0 || strcmp(dot, ".hts") == 0 ){
        buf = "text/html";

	/* Images */
    } else if ( strcmp( dot, ".gif" ) == 0 ){
        buf = "image/gif";
    } else if ( strcmp( dot, ".png" ) == 0 ){
        buf = "image/png";
    } else if ( strcmp( dot, ".bmp" ) == 0 ){
        buf = "application/x-MS-bmp";
    } else if ( strcmp( dot, ".jpg" ) == 0 || strcmp( dot, ".jpeg" ) == 0 || strcmp( dot, ".jpe" ) == 0 || strcmp( dot, ".jpz" ) == 0 ){
        buf = "image/jpeg";

	/* Audio & Video */
    } else if ( strcmp( dot, ".wav" ) == 0 ){
        buf = "audio/wav";
    } else if ( strcmp( dot, ".wma" ) == 0 ){
        buf = "audio/x-ms-wma";
    } else if ( strcmp( dot, ".wmv" ) == 0 ){
        buf = "audio/x-ms-wmv";
    } else if ( strcmp( dot, ".au" ) == 0 || strcmp( dot, ".snd" ) == 0 ){
        buf = "audio/basic";
    } else if ( strcmp( dot, ".midi" ) == 0 || strcmp( dot, ".mid" ) == 0 ){
        buf = "audio/midi";
    } else if ( strcmp( dot, ".mp3" ) == 0 || strcmp( dot, ".mp2" ) == 0 ){
        buf = "audio/x-mpeg";
	} else if ( strcmp( dot, ".rm" ) == 0  || strcmp( dot, ".rmvb" ) == 0 || strcmp( dot, ".rmm" ) == 0 ){
        buf = "audio/x-pn-realaudio";
    } else if ( strcmp( dot, ".avi" ) == 0 ){
        buf = "video/x-msvideo";
    } else if ( strcmp( dot, ".3gp" ) == 0 ){
        buf = "video/3gpp";
    } else if ( strcmp( dot, ".mov" ) == 0 ){
        buf = "video/quicktime";
    } else if ( strcmp( dot, ".wmx" ) == 0 ){
        buf = "video/x-ms-wmx";
	} else if ( strcmp( dot, ".asf" ) == 0  || strcmp( dot, ".asx" ) == 0 ){
        buf = "video/x-ms-asf";
    } else if ( strcmp( dot, ".mp4" ) == 0 || strcmp( dot, ".mpg4" ) == 0 ){
        buf = "video/mp4";
	} else if ( strcmp( dot, ".mpe" ) == 0  || strcmp( dot, ".mpeg" ) == 0 || strcmp( dot, ".mpg" ) == 0 || strcmp( dot, ".mpga" ) == 0 ){
        buf = "video/mpeg";

	/* Documents */
    } else if ( strcmp( dot, ".pdf" ) == 0 ){
        buf = "application/pdf";
    } else if ( strcmp( dot, ".rtf" ) == 0 ){
        buf = "application/rtf";
	} else if ( strcmp( dot, ".doc" ) == 0  || strcmp( dot, ".dot" ) == 0 ){
        buf = "application/msword";
	} else if ( strcmp( dot, ".xls" ) == 0  || strcmp( dot, ".xla" ) == 0 ){
        buf = "application/msexcel";
	} else if ( strcmp( dot, ".hlp" ) == 0  || strcmp( dot, ".chm" ) == 0 ){
        buf = "application/mshelp";
	} else if ( strcmp( dot, ".swf" ) == 0  || strcmp( dot, ".swfl" ) == 0 || strcmp( dot, ".cab" ) == 0 ){
        buf = "application/x-shockwave-flash";
	} else if ( strcmp( dot, ".ppt" ) == 0  || strcmp( dot, ".ppz" ) == 0 || strcmp( dot, ".pps" ) == 0 || strcmp( dot, ".pot" ) == 0 ){
        buf = "application/mspowerpoint";

	/* Binary & Packages */
    } else if ( strcmp( dot, ".zip" ) == 0 ){
        buf = "application/zip";
    } else if ( strcmp( dot, ".rar" ) == 0 ){
        buf = "application/x-rar-compressed";
    } else if ( strcmp( dot, ".gz" ) == 0 ){
        buf = "application/x-gzip";
    } else if ( strcmp( dot, ".jar" ) == 0 ){
        buf = "application/java-archive";
	} else if ( strcmp( dot, ".tgz" ) == 0  || strcmp( dot, ".tar" ) == 0 ){
        buf = "application/x-tar";
	} else {
		buf = "application/octet-stream";
	}
	strcpy(ret, buf);
}



/********************************
 *
 *   Http Server Core Function
 *
 ********************************/

 
/**
 * Usage message
 *
 */
static void Usage(char *exefile){
	/* Print copyright information */
	fprintf(stderr, "#=======================================\n");
	fprintf(stderr, "# TieMa(Tiny&Mini) Http Server\n");
	fprintf(stderr, "# Version %s\n", VERSION);
	fprintf(stderr, "# \n");
	fprintf(stderr, "# heiyeluren <blog.csdn.net/heiyeshuwu>\n");
	fprintf(stderr, "#=======================================\n\n");
    fprintf(stderr, "Usage: %s [OPTION] ... \n", exefile);

	/* Print options information */
	fprintf(stderr, "\nOptions: \n\
  -D, --is-deubg	Is open debug mode, default No\n\
  -d, --is-daemon	Is daemon running, default No\n\
  -p, --port=PORT	Server listen port, default 80\n\
  -m, --max-client=SIZE	Max connection requests, default 100\n\
  -L, --is-log		Is write access log, default No\n\
  -l, --log-path=PATH	Access log path, default /tmp/tmhttpd.log\n\
  -b, --is-browse	Is allow browse file/dir list, default No\n\
  -r, --doc-root=PATH	Web document root directory, default programe current directory ./\n\
  -i, --dir-index=FILE	Directory default index file name, default index.html\n\
  -h, --help		Print help information\n");

	/* Print example information */
	fprintf(stderr, "\nExample: \n\
  %s -d -p 80 -m 128 -L -l /tmp/access.log -b -r /var/www -i index.html\n\
  %s -d -p80 -m128 -L -l/tmp/access.log -b -r/var/www -iindex.html\n\
  %s --is-daemon --port=80 --max-client=128 --is-log --log-path=/tmp/access.log --is-browse --doc-root=/var/www --dir-index=index.html\n\n", exefile, exefile, exefile);

}

/**
 * Output environment and configure information
 *
 */
static void PrintConfig(){
	fprintf(stderr, "===================================\n");
	fprintf(stderr, " tmhttpd Configure information\n");
	fprintf(stderr, "===================================\n");
	fprintf(stderr, "Is-Debug\t = %s\n", g_is_debug ? "Yes" : "No");
	fprintf(stderr, "Is-Daemon\t = %s\n", g_is_daemon ? "Yes" : "No");
	fprintf(stderr, "Port\t\t = %d\n", g_port);
	fprintf(stderr, "Max-Client\t = %d\n", g_max_client);
	fprintf(stderr, "Is-Log\t\t = %s\n", g_is_log ? "Yes" : "No");
	fprintf(stderr, "Log-Path\t = %s\n", g_log_path);
	fprintf(stderr, "Is-Browse\t = %s\n", g_is_browse ? "Yes" : "No");
	fprintf(stderr, "Doc-Root\t = %s\n", g_doc_root);
	fprintf(stderr, "Dir-Index\t = %s\n", g_dir_index);
	fprintf(stderr, "===================================\n\n");
}

/**
 * Log message
 *
 */
static int WriteLog( const char *message ){
	if ( !g_is_log ){
		fprintf(stderr, "%s", message);
		return 0;
	}
	if ( g_log_fd == 0 ){
		if ( (g_log_fd = open(g_log_path, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1 ){
			perror("open log file error");
			return -1;
		}
	}
	if (write(g_log_fd, message, strlen(message)) == -1){
		perror("write log error");
		return -1;
	}

	return 0;
}

/**
 * Send http header
 *
 */
static int SendHeaders(int client_sock, int status, char *title, char *extra_header, char *mime_type, off_t length, time_t mod ){
    time_t now;
    char timebuf[100], buf[BUFFER_SIZE], buf_all[REQUEST_MAX_SIZE], log[8];

	/* Make http head information */
    memset(buf, 0, strlen(buf));
    sprintf(buf, "%s %d %s\r\n", "HTTP/1.0", status, title);
    strcat(buf_all, buf);

    memset(buf, 0, strlen(buf));
    sprintf(buf, "Server: %s\r\n", SERVER_NAME);
    strcat(buf_all, buf);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲h精品动漫在线观看| 国内久久精品视频| 亚洲综合久久av| 一区二区三区四区不卡在线| 国产精品久久福利| 自拍偷拍国产精品| 亚洲宅男天堂在线观看无病毒| 欧美午夜精品一区二区三区| 亚洲一区免费视频| 视频在线在亚洲| 制服丝袜成人动漫| proumb性欧美在线观看| 国产精品自拍三区| 丝瓜av网站精品一区二区| 国产精品久久久久久久久免费樱桃| 欧美电影在线免费观看| 91麻豆福利精品推荐| 国产成人高清在线| 国产精品综合av一区二区国产馆| 天天av天天翘天天综合网 | 国产馆精品极品| 亚洲成人精品一区| 日日欢夜夜爽一区| 视频一区二区三区在线| 免费成人在线播放| 奇米精品一区二区三区在线观看| 视频一区视频二区在线观看| 久久精品999| 欧美图区在线视频| 欧美一区二区三区日韩| 一色屋精品亚洲香蕉网站| 欧美激情在线看| 久久色在线视频| 在线观看日韩高清av| 色综合久久中文字幕综合网| 色综合久久久久| 亚洲欧美偷拍卡通变态| 91精品福利视频| 日韩不卡一区二区| 国产精品正在播放| 91丨porny丨最新| 91精品国产综合久久国产大片| 久久久精品黄色| 一区二区三区**美女毛片| 日韩1区2区3区| 成人av综合在线| 欧美视频在线一区| 欧美a级一区二区| 国产在线日韩欧美| 99精品国产99久久久久久白柏| 欧美日韩在线播放三区| 国产日韩欧美a| 五月婷婷久久综合| 高清不卡在线观看| 欧美精品黑人性xxxx| 国产午夜一区二区三区| 午夜激情综合网| 国产suv精品一区二区883| 欧美视频在线一区| 国产精品成人免费| 美女视频黄免费的久久 | 99久久久久免费精品国产| 欧美精品免费视频| 最新中文字幕一区二区三区| 日韩电影网1区2区| 色综合天天综合网天天看片| 精品国产99国产精品| 亚洲午夜精品17c| 成人黄色777网| ww亚洲ww在线观看国产| 日韩成人伦理电影在线观看| 成人精品国产一区二区4080 | 日韩福利视频网| 99国产精品久久久久久久久久| 日韩免费看网站| 亚洲成人一区二区在线观看| 成人看片黄a免费看在线| 日韩欧美在线123| 亚洲成人午夜电影| 色94色欧美sute亚洲线路一ni| 欧美激情艳妇裸体舞| 久久se精品一区精品二区| 欧美日韩日日骚| 一区二区三区精品视频在线| 成人免费观看男女羞羞视频| 精品国产免费人成电影在线观看四季 | 欧美电影在哪看比较好| 亚洲一区二区三区小说| 91碰在线视频| 亚洲精选视频免费看| 国产成人自拍网| 日韩丝袜情趣美女图片| 亚洲综合一区二区三区| 丁香网亚洲国际| 中文字幕成人av| 亚洲3atv精品一区二区三区| 日本伦理一区二区| 亚洲欧美视频一区| kk眼镜猥琐国模调教系列一区二区| 国产亚洲一区二区三区四区| 精品一区二区三区免费播放| 久久久91精品国产一区二区三区| 成人美女在线视频| 91麻豆精品国产91久久久资源速度| 国产传媒日韩欧美成人| 欧美大片免费久久精品三p| 蜜臀av一区二区三区| 亚洲精品一区二区三区精华液| 午夜精品爽啪视频| 精品国产凹凸成av人导航| 国产河南妇女毛片精品久久久| 国产精品少妇自拍| 91国产福利在线| 性久久久久久久| 久久美女艺术照精彩视频福利播放 | 国产精品私人自拍| 成人av资源下载| 免费在线观看不卡| 亚洲高清在线视频| 亚洲成a人片综合在线| 久久久一区二区三区捆绑**| 国产成人综合自拍| 国产精品入口麻豆原神| 在线视频国内自拍亚洲视频| 蜜臀精品一区二区三区在线观看 | 中文字幕免费一区| 奇米一区二区三区av| 欧美videossexotv100| 亚洲成人激情综合网| 日韩一区二区三区三四区视频在线观看| 一区二区三区四区激情| 国产在线精品一区二区| 色系网站成人免费| 石原莉奈在线亚洲三区| 91精品国产综合久久精品app | 国产91清纯白嫩初高中在线观看| 久久精品一级爱片| 99re热视频精品| 一区二区三区四区av| 欧美大白屁股肥臀xxxxxx| 久久99精品久久久久久久久久久久| 欧美韩国日本不卡| 色www精品视频在线观看| 免费久久99精品国产| 国产三级一区二区三区| 欧美性淫爽ww久久久久无| 久久精品国产一区二区三| 国产精品美女久久久久av爽李琼| 91网站在线播放| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品另类一区| 欧美三级在线播放| 人人精品人人爱| 国产亚洲欧美激情| 欧美伦理视频网站| 国产不卡视频一区| 视频一区视频二区中文| 久久精品视频一区二区三区| 欧美视频自拍偷拍| 国产一区二区三区免费观看| 夜夜精品浪潮av一区二区三区| 91麻豆精品国产91久久久久| 成人高清视频在线观看| 无吗不卡中文字幕| 亚洲欧美在线高清| 日韩欧美一区在线| 欧美性做爰猛烈叫床潮| 成人黄色免费短视频| 首页亚洲欧美制服丝腿| 亚洲欧洲av另类| 精品欧美乱码久久久久久| 在线看国产日韩| 国产传媒久久文化传媒| 伦理电影国产精品| 亚洲嫩草精品久久| 国产欧美日韩一区二区三区在线观看| 欧亚一区二区三区| 国产成人在线视频网址| 一二三四区精品视频| 国产精品久久久爽爽爽麻豆色哟哟| 欧美性xxxxxx少妇| 国产91精品在线观看| 蜜臂av日日欢夜夜爽一区| 亚洲激情一二三区| ...av二区三区久久精品| 337p粉嫩大胆噜噜噜噜噜91av| 欧美日韩国产片| 成人av网站免费观看| 国产成人精品影视| 免费成人美女在线观看.| 午夜精品视频一区| 亚洲精品乱码久久久久久| 国产精品毛片久久久久久| 久久人人爽人人爽| 日韩美女天天操| 日韩视频一区二区三区| 日本高清视频一区二区| 国产又黄又大久久| 美腿丝袜亚洲三区| 免费的国产精品|