青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

興海北路

---男兒仗劍自橫行
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

統計

  • 隨筆 - 85
  • 文章 - 0
  • 評論 - 17
  • 引用 - 0

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

收藏夾

全是知識啊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

Linux軟件下載源碼編程文章資料周立發服務器源代碼如下:
服務器源代碼如下:
#include <stdarg.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <signal.h>
#include <getopt.h>

#define DEFAULTIP "127.0.0.1"
#define DEFAULTPORT "80"
#define DEFAULTBACK "10"
#define DEFAULTDIR "/home"
#define DEFAULTLOG "/tmp/das-server.log"

void prterrmsg(char *msg);
#define prterrmsg(msg)        { perror(msg); abort(); }
void wrterrmsg(char *msg);
#define wrterrmsg(msg)        { fputs(msg, logfp); fputs(strerror(errno), logfp);fflush(logfp); abort(); }

void prtinfomsg(char *msg);
#define prtinfomsg(msg)        { fputs(msg, stdout);  }
void wrtinfomsg(char *msg);
#define wrtinfomsg(msg)        {  fputs(msg, logfp); fflush(logfp);}

#define MAXBUF        1024

char buffer[MAXBUF + 1];
char *host = 0;
char *port = 0;
char *back = 0;
char *dirroot = 0;
char *logdir = 0;
unsigned char daemon_y_n = 0;
FILE *logfp;

#define MAXPATH        150

/*----------------------------------------
 *--- dir_up - 查找dirpath所指目錄的上一級目錄
 *----------------------------------------
 */
char *dir_up(char *dirpath)
{
    static char Path[MAXPATH];
    int len;

    strcpy(Path, dirpath);
    len = strlen(Path);
    if (len > 1 && Path[len - 1] == '/')
        len--;
    while (Path[len - 1] != '/' && len > 1)
        len--;
    Path[len] = 0;
    return Path;
}

/*------------------------------------------------------
 *--- AllocateMemory - 分配空間并把d所指的內容復制
 *------------------------------------------------------
 */
void AllocateMemory(char **s, int l, char *d)
{
    *s = malloc(l + 1);
    bzero(*s, l + 1);
    memcpy(*s, d, l);
}
/************關于本文檔********************************************
*filename: das-server.c
*purpose: 這是在Linux下用C語言寫的目錄訪問服務器,支持目錄瀏覽和文件下載
*wrote by: zhoulifa(zhoulifa@163.com) 周立發(http://zhoulifa.bokee.com)
Linux愛好者 Linux知識傳播者 SOHO族 開發者 最擅長C語言
*date time:2007-01-26 19:32
*Note: 任何人可以任意復制代碼并運用這些文檔,當然包括你的商業用途
* 但請遵循GPL
*Thanks to: Google.com
*Hope:希望越來越多的人貢獻自己的力量,為科學技術發展出力
* 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
*********************************************************************/
/*------------------------------------------------------
 *--- GiveResponse - 把Path所指的內容發送到client_sock去
 *-------------------如果Path是一個目錄,則列出目錄內容
 *-------------------如果Path是一個文件,則下載文件
 *------------------------------------------------------
 */
void GiveResponse(FILE * client_sock, char *Path)
{
    struct dirent *dirent;
    struct stat info;
    char Filename[MAXPATH];
    DIR *dir;
    int fd, len, ret;
    char *p, *realPath, *realFilename, *nport;

    /* 獲得實際工作目錄或文件 */
    len = strlen(dirroot) + strlen(Path) + 1;
    realPath = malloc(len + 1);
    bzero(realPath, len + 1);
    sprintf(realPath, "%s/%s", dirroot, Path);

    /* 獲得實際工作端口 */
    len = strlen(port) + 1;
    nport = malloc(len + 1);
    bzero(nport, len + 1);
    sprintf(nport, ":%s", port);

    /* 獲得實際工作目錄或文件的信息以判斷是文件還是目錄 */
    if (stat(realPath, &info)) {
        fprintf(client_sock,
                "HTTP/1.1 200 OK\r\nServer: DAS by ZhouLifa\r\nConnection: close\r\n\r\n<html><head><title>%d - %s</title></head>"
                "<body><font size=+4>Linux 下目錄訪問服務器</font><br><hr width=\"100%%\"><br><center>"
                "<table border cols=3 width=\"100%%\">", errno,
                strerror(errno));
        fprintf(client_sock,
                "</table><font color=\"CC0000\" size=+2>請向管理員咨詢為何出現如下錯誤提示:\n%s %s</font></body></html>",
                Path, strerror(errno));
        goto out;
    }
    /* 處理瀏覽文件請求,即下載文件 */
    if (S_ISREG(info.st_mode)) {
        fd = open(realPath, O_RDONLY);
        len = lseek(fd, 0, SEEK_END);
        p = (char *) malloc(len + 1);
        bzero(p, len + 1);
        lseek(fd, 0, SEEK_SET);
        ret = read(fd, p, len);
        close(fd);
        fprintf(client_sock,
                "HTTP/1.1 200 OK\r\nServer: DAS by ZhouLifa\r\nConnection: keep-alive\r\nContent-type: application/*\r\nContent-Length:%d\r\n\r\n",
                len);
        fwrite(p, len, 1, client_sock);
        free(p);
    } else if (S_ISDIR(info.st_mode)) {
        /* 處理瀏覽目錄請求 */
        dir = opendir(realPath);
        fprintf(client_sock,
                "HTTP/1.1 200 OK\r\nServer: DAS by ZhouLifa\r\nConnection: close\r\n\r\n<html><head><title>%s</title></head>"
                "<body><font size=+4>Linux 下目錄訪問服務器</font><br><hr width=\"100%%\"><br><center>"
                "<table border cols=3 width=\"100%%\">", Path);
        fprintf(client_sock,
                "<caption><font size=+3>目錄 %s</font></caption>\n",
                Path);
        fprintf(client_sock,
                "<tr><td>名稱</td><td>大小</td><td>修改時間</td></tr>\n");
        if (dir == 0) {
            fprintf(client_sock,
                    "</table><font color=\"CC0000\" size=+2>%s</font></body></html>",
                    strerror(errno));
            return;
        }
        /* 讀取目錄里的所有內容 */
        while ((dirent = readdir(dir)) != 0) {
            if (strcmp(Path, "/") == 0)
                sprintf(Filename, "/%s", dirent->d_name);
            else
                sprintf(Filename, "%s/%s", Path, dirent->d_name);
            fprintf(client_sock, "<tr>");
            len = strlen(dirroot) + strlen(Filename) + 1;
            realFilename = malloc(len + 1);
            bzero(realFilename, len + 1);
            sprintf(realFilename, "%s/%s", dirroot, Filename);
            if (stat(realFilename, &info) == 0) {
                if (strcmp(dirent->d_name, "..") == 0)
                    fprintf(client_sock,
                            "<td><a href=\"http://%s%s%s\">(parent)</a></td>",
                            host, atoi(port) == 80 ? "" : nport,
                            dir_up(Path));
                else
                    fprintf(client_sock,
                            "<td><a href=\"http://%s%s%s\">%s</a></td>",
                            host, atoi(port) == 80 ? "" : nport, Filename,
                            dirent->d_name);
                if (S_ISDIR(info.st_mode))
                    fprintf(client_sock, "<td>目錄</td>");
                else if (S_ISREG(info.st_mode))
                    fprintf(client_sock, "<td>%d</td>", info.st_size);
                else if (S_ISLNK(info.st_mode))
                    fprintf(client_sock, "<td>鏈接</td>");
                else if (S_ISCHR(info.st_mode))
                    fprintf(client_sock, "<td>字符設備</td>");
                else if (S_ISBLK(info.st_mode))
                    fprintf(client_sock, "<td>塊設備</td>");
                else if (S_ISFIFO(info.st_mode))
                    fprintf(client_sock, "<td>FIFO</td>");
                else if (S_ISSOCK(info.st_mode))
                    fprintf(client_sock, "<td>Socket</td>");
                else
                    fprintf(client_sock, "<td>(未知)</td>");
                fprintf(client_sock, "<td>%s</td>", ctime(&info.st_ctime));
            }
            fprintf(client_sock, "</tr>\n");
            free(realFilename);
        }
        fprintf(client_sock, "</table></center></body></html>");
    } else {
        /* 既非常規文件又非目錄,禁止訪問 */
        fprintf(client_sock,
                "HTTP/1.1 200 OK\r\nServer: DAS by ZhouLifa\r\nConnection: close\r\n\r\n<html><head><title>permission denied</title></head>"
                "<body><font size=+4>Linux 下目錄訪問服務器</font><br><hr width=\"100%%\"><br><center>"
                "<table border cols=3 width=\"100%%\">");
        fprintf(client_sock,
                "</table><font color=\"CC0000\" size=+2>你訪問的資源'%s'被禁止訪問,請聯系管理員解決!</font></body></html>",
                Path);
    }
  out:
    free(realPath);
    free(nport);
}

/*------------------------------------------------------
 *--- getoption - 分析取出程序的參數
 *------------------------------------------------------
 */
void getoption(int argc, char **argv)
{
    int c, len;
    char *p = 0;

    opterr = 0;
    while (1) {
        int option_index = 0;
        static struct option long_options[] = {
            {"host", 1, 0, 0},
            {"port", 1, 0, 0},
            {"back", 1, 0, 0},
            {"dir", 1, 0, 0},
            {"log", 1, 0, 0},
            {"daemon", 0, 0, 0},
            {0, 0, 0, 0}
        };
        /* 本程序支持如一些參數:
         * --host IP地址 或者 -H IP地址
         * --port 端口 或者 -P 端口
         * --back 監聽數量 或者 -B 監聽數量
         * --dir 網站根目錄 或者 -D 網站根目錄
         * --log 日志存放路徑 或者 -L 日志存放路徑
         * --daemon 使程序進入后臺運行模式
         */
        c = getopt_long(argc, argv, "H:P:B:D:L",
                        long_options, &option_index);
        if (c == -1 || c == '?')
            break;

        if(optarg)        len = strlen(optarg);
        else        len = 0;

        if ((!c && !(strcasecmp(long_options[option_index].name, "host")))
            || c == 'H')
            p = host = malloc(len + 1);
        else if ((!c
                  &&
                  !(strcasecmp(long_options[option_index].name, "port")))
                 || c == 'P')
            p = port = malloc(len + 1);
        else if ((!c
                  &&
                  !(strcasecmp(long_options[option_index].name, "back")))
                 || c == 'B')
            p = back = malloc(len + 1);
        else if ((!c
                  && !(strcasecmp(long_options[option_index].name, "dir")))
                 || c == 'D')
            p = dirroot = malloc(len + 1);
        else if ((!c
                  && !(strcasecmp(long_options[option_index].name, "log")))
                 || c == 'L')
            p = logdir = malloc(len + 1);
        else if ((!c
                  &&
                  !(strcasecmp
                    (long_options[option_index].name, "daemon")))) {
            daemon_y_n = 1;
            continue;
        }
        else
            break;
        bzero(p, len + 1);
        memcpy(p, optarg, len);
    }
}

int main(int argc, char **argv)
{
    struct sockaddr_in addr;
    int sock_fd, addrlen;

    /* 獲得程序工作的參數,如 IP 、端口、監聽數、網頁根目錄、目錄存放位置等 */
    getoption(argc, argv);

    if (!host) {
        addrlen = strlen(DEFAULTIP);
        AllocateMemory(&host, addrlen, DEFAULTIP);
    }
    if (!port) {
        addrlen = strlen(DEFAULTPORT);
        AllocateMemory(&port, addrlen, DEFAULTPORT);
    }
    if (!back) {
        addrlen = strlen(DEFAULTBACK);
        AllocateMemory(&back, addrlen, DEFAULTBACK);
    }
    if (!dirroot) {
        addrlen = strlen(DEFAULTDIR);
        AllocateMemory(&dirroot, addrlen, DEFAULTDIR);
    }
    if (!logdir) {
        addrlen = strlen(DEFAULTLOG);
        AllocateMemory(&logdir, addrlen, DEFAULTLOG);
    }

    printf
        ("host=%s port=%s back=%s dirroot=%s logdir=%s %s是后臺工作模式(進程ID:%d)\n",
         host, port, back, dirroot, logdir, daemon_y_n?"":"不", getpid());

    /* fork() 兩次處于后臺工作模式下 */
    if (daemon_y_n) {
        if (fork())
            exit(0);
        if (fork())
            exit(0);
        close(0), close(1), close(2);
        logfp = fopen(logdir, "a+");
        if (!logfp)
            exit(0);
    }

    /* 處理子進程退出以免產生僵尸進程 */
    signal(SIGCHLD, SIG_IGN);

    /* 創建 socket */
    if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        if (!daemon_y_n) {
            prterrmsg("socket()");
        } else {
            wrterrmsg("socket()");
        }
    }

    /* 設置端口快速重用 */
    addrlen = 1;
    setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &addrlen,
               sizeof(addrlen));

    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(port));
    addr.sin_addr.s_addr = inet_addr(host);
    addrlen = sizeof(struct sockaddr_in);
    /* 綁定地址、端口等信息 */
    if (bind(sock_fd, (struct sockaddr *) &addr, addrlen) < 0) {
        if (!daemon_y_n) {
            prterrmsg("bind()");
        } else {
            wrterrmsg("bind()");
        }
    }

    /* 開啟臨聽 */
    if (listen(sock_fd, atoi(back)) < 0) {
        if (!daemon_y_n) {
            prterrmsg("listen()");
        } else {
            wrterrmsg("listen()");
        }
    }
    while (1) {
        int len;
        int new_fd;
        addrlen = sizeof(struct sockaddr_in);
        /* 接受新連接請求 */
        new_fd = accept(sock_fd, (struct sockaddr *) &addr, &addrlen);
        if (new_fd < 0) {
            if (!daemon_y_n) {
                prterrmsg("accept()");
            } else {
                wrterrmsg("accept()");
            }
            break;
        }
        bzero(buffer, MAXBUF + 1);
        sprintf(buffer, "連接來自于: %s:%d\n",
                inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
        if (!daemon_y_n) {
            prtinfomsg(buffer);
        } else {
            wrtinfomsg(buffer);
        }
        /* 產生一個子進程去處理請求,當前進程繼續等待新的連接到來 */
        if (!fork()) {
            bzero(buffer, MAXBUF + 1);
            if ((len = recv(new_fd, buffer, MAXBUF, 0)) > 0) {
                FILE *ClientFP = fdopen(new_fd, "w");
                if (ClientFP == NULL) {
                    if (!daemon_y_n) {
                        prterrmsg("fdopen()");
                    } else {
                        prterrmsg("fdopen()");
                    }
                } else {
                    char Req[MAXPATH + 1] = "";
                    sscanf(buffer, "GET %s HTTP", Req);
                    bzero(buffer, MAXBUF + 1);
                    sprintf(buffer, "請求取文件: \"%s\"\n", Req);
                    if (!daemon_y_n) {
                        prtinfomsg(buffer);
                    } else {
                        wrtinfomsg(buffer);
                    }
                    /* 處理用戶請求 */
                    GiveResponse(ClientFP, Req);
                    fclose(ClientFP);
                }
            }
            exit(0);
        }
        close(new_fd);
    }
    close(sock_fd);
    return 0;
}


編譯程序用下列命令:
gcc -Wall das-server.c -o das-server
注:das即 Dictory Access Server

以root用戶啟動服務程序用下列命令:
./das-server
或以普通用戶啟動服務程序用下列命令:
./das-server --port 7838

./das-server -P 7838

注:只有root用戶才有權限啟動1024以下的端口,所以如果想用默認的80端口就得用root來運行。

如果要想讓程序在后臺自動運行,即處理精靈模式下工作,在命令后面加上--daemon參數即可。

打開一個網絡瀏覽器輸入服務地址開始瀏覽,如下圖:


下載文件如下圖:

注:請不要下載較大的文件,比如文件大小超過10M的,因為程序是一次分配內存,會占用系統內存較大導致系統死掉!

posted on 2008-06-30 10:07 隨意門 閱讀(554) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久综合免费视频| 一区二区av在线| 亚洲国产日韩欧美| 狠狠色伊人亚洲综合网站色| 国产精品久久久久影院色老大| 欧美日韩亚洲另类| 欧美亚洲第一区| 国产精品呻吟| 国产一区二区三区四区hd| 国产一区二区高清| 在线观看视频欧美| 亚洲精品永久免费精品| 在线亚洲一区观看| 亚洲欧美中文另类| 久久免费偷拍视频| 91久久久在线| 日韩亚洲综合在线| 欧美一区二区性| 欧美激情二区三区| 国产精品多人| 在线观看成人av| 亚洲天堂网在线观看| 久久久国产精品一区二区中文| 欧美黄色aaaa| 亚洲男人的天堂在线| 麻豆精品在线视频| 国产精品对白刺激久久久| 亚洲成人在线视频网站| 亚洲综合国产激情另类一区| 久久综合给合| 亚洲一级一区| 欧美第一黄色网| 国产综合久久久久久| 一本一本大道香蕉久在线精品| 久久精品欧美日韩| 亚洲精品视频一区二区三区| 亚洲国产乱码最新视频| 国产欧美视频一区二区三区| 欧美1区2区视频| 国产精品中文在线| 老司机67194精品线观看| 亚洲少妇自拍| 欧美国产大片| 在线成人小视频| 久久国产视频网站| 日韩一区二区精品| 欧美aⅴ一区二区三区视频| 国产精品无码专区在线观看| 99av国产精品欲麻豆| 狼人天天伊人久久| 亚洲一区二区在线看| 欧美日韩激情网| 亚洲美女诱惑| 亚洲大胆人体视频| 久久综合色播五月| 在线视频国内自拍亚洲视频| 久久全球大尺度高清视频| 亚洲一区二区在线免费观看视频| 欧美日韩成人免费| 亚洲日本视频| 亚洲国产精品一区在线观看不卡| 久久久美女艺术照精彩视频福利播放| 国产精品亚洲美女av网站| 亚洲在线一区二区三区| av成人老司机| 国产精品无码永久免费888| 亚洲欧洲99久久| 亚洲欧美国产制服动漫| 国产欧美在线观看| 久久资源av| 欧美jizz19性欧美| 日韩视频在线一区二区| 亚洲黄色高清| 欧美日韩一区二区三区四区在线观看 | 亚洲已满18点击进入久久| 亚洲黄页视频免费观看| 欧美高清视频在线播放| 一二三四社区欧美黄| 日韩一本二本av| 国产美女精品免费电影| 久久久久久夜| 亚洲日韩欧美视频一区| 美女视频黄a大片欧美| 亚洲品质自拍| 99视频一区| 国产午夜精品在线| 女人香蕉久久**毛片精品| 欧美69wwwcom| 亚洲免费视频成人| 中国成人黄色视屏| 久久久精品午夜少妇| 一区精品久久| 亚洲精品国产精品国自产观看| 欧美电影免费观看网站| 亚洲午夜精品久久久久久app| 亚洲欧美日本国产专区一区| 伊人影院久久| 999亚洲国产精| 韩国一区二区在线观看| 亚洲人成网站在线播| 国产免费成人av| 欧美激情四色| 国产精品欧美久久久久无广告| 久久婷婷av| 国产精品久久久久久福利一牛影视| 久久天天狠狠| 国产精品久久久一本精品| 欧美jizzhd精品欧美喷水| 欧美理论片在线观看| 欧美一区二视频| 欧美精品亚洲一区二区在线播放| 午夜精彩国产免费不卡不顿大片| 久久久久久久网站| 午夜免费久久久久| 欧美精品xxxxbbbb| 噜噜噜久久亚洲精品国产品小说| 欧美日韩亚洲一区二区| 欧美成人在线免费观看| 国产精品高清网站| 亚洲黄色天堂| 亚洲第一精品久久忘忧草社区| 亚洲一区日韩在线| 一区二区三区欧美日韩| 欧美a级片网| 巨胸喷奶水www久久久免费动漫| 欧美视频一区| 亚洲乱码国产乱码精品精天堂 | 久久久噜噜噜久久久| 午夜精品一区二区三区电影天堂 | 亚洲视频一区在线| 最新成人av网站| 久久av资源网站| 久久成人精品电影| 欧美日韩直播| 亚洲乱码国产乱码精品精| 亚洲精品免费观看| 久久乐国产精品| 欧美成人免费视频| 国内视频精品| 久久精品二区三区| 久久精品视频网| 国产深夜精品| 久久精品国产久精国产思思| 久久国产一二区| 韩国欧美一区| 久久一区中文字幕| 欧美国产日韩一区二区| 亚洲激情一区二区| 欧美激情四色 | 一区二区三区视频免费在线观看| 亚洲国产成人91精品| 麻豆成人综合网| 免费成人黄色片| 亚洲精品视频在线| 欧美理论电影在线播放| 亚洲最新视频在线播放| 亚洲综合日本| 国产综合香蕉五月婷在线| 久久久久久九九九九| 欧美超级免费视 在线| 亚洲精品欧美日韩| 欧美小视频在线| 久久精品二区| 亚洲精品一区二区三| 亚洲欧美自拍偷拍| 在线播放不卡| 欧美日韩一区二区三区在线视频| 夜夜爽www精品| 久久精品日产第一区二区三区| 韩国av一区二区三区在线观看| 欧美 日韩 国产一区二区在线视频| 亚洲国产黄色片| 欧美一区二区三区视频在线| 亚洲成色777777女色窝| 欧美性一二三区| 久久亚洲国产精品一区二区| 亚洲精品一区二区网址| 久久精品30| 日韩视频免费观看| 国产日韩欧美一区| 欧美+日本+国产+在线a∨观看| 中文精品视频| 欧美黄色影院| 亚洲欧美日韩精品久久久久| 狠狠干狠狠久久| 国产精品黄色在线观看| 免费观看日韩av| 欧美伊人久久久久久久久影院 | 亚洲天堂视频在线观看| 久久蜜桃av一区精品变态类天堂| 亚洲欧洲日韩在线| 国产亚洲欧美另类中文| 欧美另类一区| 久久理论片午夜琪琪电影网| 亚洲午夜高清视频| 亚洲欧洲一区二区在线播放| 久久天堂成人| 久久精品国产亚洲一区二区| 一区二区三区欧美成人| 亚洲精品欧美激情|