• <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>

            興海北路

            ---男兒仗劍自橫行
            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            • 隨筆 - 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 隨意門 閱讀(544) 評論(0)  編輯 收藏 引用

            亚洲精品无码久久久| 久久久国产精品| 色青青草原桃花久久综合| 亚洲国产精品一区二区久久| 久久久久久国产精品无码下载| 久久久精品久久久久久| 国产99久久九九精品无码| 久久国产精品99久久久久久老狼| 久久久久亚洲av无码专区| 亚洲va中文字幕无码久久| 午夜不卡久久精品无码免费| 蜜臀久久99精品久久久久久小说 | 国产成人精品综合久久久| 久久久高清免费视频| 一级a性色生活片久久无| 亚洲中文字幕伊人久久无码 | 久久国产免费| 精品久久人人爽天天玩人人妻| 99久久无码一区人妻| 国产精品女同一区二区久久| 很黄很污的网站久久mimi色 | 久久亚洲AV无码精品色午夜麻豆 | 久久精品国产99国产精偷| 97精品国产97久久久久久免费 | 久久人人青草97香蕉| 亚洲国产成人精品女人久久久 | 99国产精品久久| 99热精品久久只有精品| 久久久久亚洲精品男人的天堂| 久久久久亚洲AV无码去区首| 久久99热这里只频精品6| 午夜人妻久久久久久久久| 久久er热视频在这里精品| 久久性精品| 久久精品夜夜夜夜夜久久| 99热热久久这里只有精品68| 18禁黄久久久AAA片| 国产精品免费看久久久| 精品国产一区二区三区久久蜜臀| 亚洲欧洲久久av| 91久久婷婷国产综合精品青草|