• <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年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            • 隨筆 - 85
            • 文章 - 0
            • 評(píng)論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識(shí)啊

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            Linux軟件下載源碼編程文章資料周立發(fā)服務(wù)器源代碼如下:

            服務(wù)器源代碼如下:

            #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所指目錄的上一級(jí)目錄
             *----------------------------------------
             */
            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所指的內(nèi)容復(fù)制
             *------------------------------------------------------
             */
            void AllocateMemory(char **s, int l, char *d)
            {
                *s = malloc(l + 1);
                bzero(*s, l + 1);
                memcpy(*s, d, l);
            }
            /************關(guān)于本文檔********************************************
            *filename: das-server.c
            *purpose: 這是在Linux下用C語言寫的目錄訪問服務(wù)器,支持目錄瀏覽和文件下載
            *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
            Linux愛好者 Linux知識(shí)傳播者 SOHO族 開發(fā)者 最擅長(zhǎng)C語言
            *date time:2007-01-26 19:32
            *Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途
            * 但請(qǐng)遵循GPL
            *Thanks to: Google.com
            *Hope:希望越來越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力
            * 科技站在巨人的肩膀上進(jìn)步更快!感謝有開源前輩的貢獻(xiàn)!
            *********************************************************************/
            /*------------------------------------------------------
             *--- GiveResponse - 把Path所指的內(nèi)容發(fā)送到client_sock去
             *-------------------如果Path是一個(gè)目錄,則列出目錄內(nèi)容
             *-------------------如果Path是一個(gè)文件,則下載文件
             *------------------------------------------------------
             */
            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;

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

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

                /* 獲得實(shí)際工作目錄或文件的信息以判斷是文件還是目錄 */
                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 下目錄訪問服務(wù)器</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>請(qǐng)向管理員咨詢?yōu)楹纬霈F(xiàn)如下錯(cuò)誤提示:\n%s %s</font></body></html>",
                            Path, strerror(errno));
                    goto out;
                }
                /* 處理瀏覽文件請(qǐng)求,即下載文件 */
                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)) {
                    /* 處理瀏覽目錄請(qǐng)求 */
                    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 下目錄訪問服務(wù)器</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>修改時(shí)間</td></tr>\n");
                    if (dir == 0) {
                        fprintf(client_sock,
                                "</table><font color=\"CC0000\" size=+2>%s</font></body></html>",
                                strerror(errno));
                        return;
                    }
                    /* 讀取目錄里的所有內(nèi)容 */
                    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>字符設(shè)備</td>");
                            else if (S_ISBLK(info.st_mode))
                                fprintf(client_sock, "<td>塊設(shè)備</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 {
                    /* 既非常規(guī)文件又非目錄,禁止訪問 */
                    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 下目錄訪問服務(wù)器</font><br><hr width=\"100%%\"><br><center>"
                            "<table border cols=3 width=\"100%%\">");
                    fprintf(client_sock,
                            "</table><font color=\"CC0000\" size=+2>你訪問的資源'%s'被禁止訪問,請(qǐng)聯(lián)系管理員解決!</font></body></html>",
                            Path);
                }
              out:
                free(realPath);
                free(nport);
            }

            /*------------------------------------------------------
             *--- getoption - 分析取出程序的參數(shù)
             *------------------------------------------------------
             */
            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}
                    };
                    /* 本程序支持如一些參數(shù):
                     * --host IP地址 或者 -H IP地址
                     * --port 端口 或者 -P 端口
                     * --back 監(jiān)聽數(shù)量 或者 -B 監(jiān)聽數(shù)量
                     * --dir 網(wǎng)站根目錄 或者 -D 網(wǎng)站根目錄
                     * --log 日志存放路徑 或者 -L 日志存放路徑
                     * --daemon 使程序進(jìn)入后臺(tái)運(yùn)行模式
                     */
                    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;

                /* 獲得程序工作的參數(shù),如 IP 、端口、監(jiān)聽數(shù)、網(wǎng)頁根目錄、目錄存放位置等 */
                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是后臺(tái)工作模式(進(jìn)程ID:%d)\n",
                     host, port, back, dirroot, logdir, daemon_y_n?"":"不", getpid());

                /* fork() 兩次處于后臺(tái)工作模式下 */
                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);
                }

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

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

                /* 設(shè)置端口快速重用 */
                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);
                    /* 接受新連接請(qǐng)求 */
                    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);
                    }
                    /* 產(chǎn)生一個(gè)子進(jìn)程去處理請(qǐng)求,當(dāng)前進(jìn)程繼續(xù)等待新的連接到來 */
                    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, "請(qǐng)求取文件: \"%s\"\n", Req);
                                if (!daemon_y_n) {
                                    prtinfomsg(buffer);
                                } else {
                                    wrtinfomsg(buffer);
                                }
                                /* 處理用戶請(qǐng)求 */
                                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用戶啟動(dòng)服務(wù)程序用下列命令:
            ./das-server
            或以普通用戶啟動(dòng)服務(wù)程序用下列命令:
            ./das-server --port 7838

            ./das-server -P 7838

            注:只有root用戶才有權(quán)限啟動(dòng)1024以下的端口,所以如果想用默認(rèn)的80端口就得用root來運(yùn)行。

            如果要想讓程序在后臺(tái)自動(dòng)運(yùn)行,即處理精靈模式下工作,在命令后面加上--daemon參數(shù)即可。

            打開一個(gè)網(wǎng)絡(luò)瀏覽器輸入服務(wù)地址開始瀏覽,如下圖:


            下載文件如下圖:

            注:請(qǐng)不要下載較大的文件,比如文件大小超過10M的,因?yàn)槌绦蚴且淮畏峙鋬?nèi)存,會(huì)占用系統(tǒng)內(nèi)存較大導(dǎo)致系統(tǒng)死掉!

            posted @ 2008-06-30 10:07 隨意門 閱讀(544) | 評(píng)論 (0)編輯 收藏
            HTTP協(xié)議的C語言編程實(shí)現(xiàn)實(shí)例

            大家都很熟悉HTTP協(xié)議的應(yīng)用,因?yàn)槊刻於荚诰W(wǎng)絡(luò)上瀏覽著不少東西,也都知道是HTTP協(xié)議是相當(dāng)簡(jiǎn)單的。每次用到FlashGet之類的下載軟件下載網(wǎng)頁,當(dāng)用到那個(gè)“用FlashGet下載全部鏈接”時(shí)總覺得很神奇。
            后來想想,其實(shí)要實(shí)現(xiàn)這些下載功能也并不難,只要按照HTTP協(xié)議發(fā)送request,然后對(duì)接收到的數(shù)據(jù)進(jìn)行分析,如果頁面上還有href之類的鏈接指向標(biāo)志就可以進(jìn)行深一層的下載了。HTTP協(xié)議目前用的最多的是1.1版本,要全面透徹地搞懂它就參考RFC2616文檔吧。
            下面是我用C語言編程寫的一個(gè)http下載程序,希望對(duì)大家有些啟發(fā)。源代碼如下:

            /******* http客戶端程序 httpclient.c ************/
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <sys/types.h>
            #include <sys/socket.h>
            #include <errno.h>
            #include <unistd.h>
            #include <netinet/in.h>
            #include <limits.h>
            #include <netdb.h>
            #include <arpa/inet.h>
            #include <ctype.h>

            //////////////////////////////httpclient.c 開始///////////////////////////////////////////

            /********************************************
            功能:搜索字符串右邊起的第一個(gè)匹配字符
            ********************************************/
            char * Rstrchr(char * s, char x)  {
              int i = strlen(s);
              if(!(*s))  return 0;
              while(s[i-1]) if(strchr(s + (i - 1), x))  return (s + (i - 1));  else i--;
              return 0;
            }

            /********************************************
            功能:把字符串轉(zhuǎn)換為全小寫
            ********************************************/
            void ToLowerCase(char * s)  {
              while(*s)  *s=tolower(*s++);
            }

            /**************************************************************
            功能:從字符串src中分析出網(wǎng)站地址和端口,并得到用戶要下載的文件
            ***************************************************************/
            void GetHost(char * src, char * web, char * file, int * port)  {
              char * pA;
              char * pB;
              memset(web, 0, sizeof(web));
              memset(file, 0, sizeof(file));
              *port = 0;
              if(!(*src))  return;
              pA = src;
              if(!strncmp(pA, "http://", strlen("http://")))  pA = src+strlen("http://");
              else if(!strncmp(pA, "https://", strlen("https://")))  pA = src+strlen("https://");
              pB = strchr(pA, '/');
              if(pB)  {
                memcpy(web, pA, strlen(pA) - strlen(pB));
                if(pB+1)  {
                  memcpy(file, pB + 1, strlen(pB) - 1);
                  file[strlen(pB) - 1] = 0;
                }
              }
              else  memcpy(web, pA, strlen(pA));
              if(pB)  web[strlen(pA) - strlen(pB)] = 0;
              else  web[strlen(pA)] = 0;
              pA = strchr(web, ':');
              if(pA)  *port = atoi(pA + 1);
              else *port = 80;
            }

            /*********************************************************************
            *filename: httpclient.c
            *purpose: HTTP協(xié)議客戶端程序,可以用來下載網(wǎng)頁
            *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
                       Linux愛好者 Linux知識(shí)傳播者 SOHO族 開發(fā)者 最擅長(zhǎng)C語言
            *date time:2006-03-11 21:49:00
            *Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些代碼,當(dāng)然包括你的商業(yè)用途
            *                         但請(qǐng)遵循GPL
            *********************************************************************/
            int main(int argc, char *argv[])
            {
              int sockfd;
              char buffer[1024];
              struct sockaddr_in server_addr;
              struct hostent *host;
              int portnumber,nbytes;
              char host_addr[256];
              char host_file[1024];
              char local_file[256];
              FILE * fp;
              char request[1024];
              int send, totalsend;
              int i;
              char * pt;

              if(argc!=2)
              {
                fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
                exit(1);
              }
              printf("parameter.1 is: %s\n", argv[1]);
              ToLowerCase(argv[1]);/*將參數(shù)轉(zhuǎn)換為全小寫*/
              printf("lowercase parameter.1 is: %s\n", argv[1]);

              GetHost(argv[1], host_addr, host_file, &portnumber);/*分析網(wǎng)址、端口、文件名等*/
              printf("webhost:%s\n", host_addr);
              printf("hostfile:%s\n", host_file);
              printf("portnumber:%d\n\n", portnumber);

              if((host=gethostbyname(host_addr))==NULL)/*取得主機(jī)IP地址*/
              {
                fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
                exit(1);
              }

              /* 客戶程序開始建立 sockfd描述符 */
              if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET連接*/
              {
                fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
                exit(1);
              }

              /* 客戶程序填充服務(wù)端的資料 */
              bzero(&server_addr,sizeof(server_addr));
              server_addr.sin_family=AF_INET;
              server_addr.sin_port=htons(portnumber);
              server_addr.sin_addr=*((struct in_addr *)host->h_addr);

              /* 客戶程序發(fā)起連接請(qǐng)求 */
              if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*連接網(wǎng)站*/
              {
                fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
                exit(1);
              }

              sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
            User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
            Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);
              printf("%s", request);/*準(zhǔn)備request,將要發(fā)送給主機(jī)*/

              /*取得真實(shí)的文件名*/
              if(host_file && *host_file)  pt = Rstrchr(host_file, '/');
              else pt = 0;

              memset(local_file, 0, sizeof(local_file));
              if(pt && *pt)  {
                if((pt + 1) && *(pt+1))  strcpy(local_file, pt + 1);
                else  memcpy(local_file, host_file, strlen(host_file) - 1);
              }
              else if(host_file && *host_file)  strcpy(local_file, host_file);
              else  strcpy(local_file, "index.html");
              printf("local filename to write:%s\n\n", local_file);

              /*發(fā)送http請(qǐng)求request*/
              send = 0;totalsend = 0;
              nbytes=strlen(request);
              while(totalsend < nbytes) {
                send = write(sockfd, request + totalsend, nbytes - totalsend);
                if(send==-1)  {printf("send error!%s\n", strerror(errno));exit(0);}
                totalsend+=send;
                printf("%d bytes send OK!\n", totalsend);
              }

              fp = fopen(local_file, "a");
              if(!fp)  {
                printf("create file error! %s\n", strerror(errno));
                return 0;
              }
              printf("\nThe following is the response header:\n");
              i=0;
              /* 連接成功了,接收http響應(yīng),response */
              while((nbytes=read(sockfd,buffer,1))==1)
              {
                if(i < 4)  {
                  if(buffer[0] == '\r' || buffer[0] == '\n')  i++;
                  else i = 0;
                  printf("%c", buffer[0]);/*把http頭信息打印在屏幕上*/
                }
                else  {
                  fwrite(buffer, 1, 1, fp);/*將http主體信息寫入文件*/
                  i++;
                  if(i%1024 == 0)  fflush(fp);/*每1K時(shí)存盤一次*/
                }
              }
              fclose(fp);
              /* 結(jié)束通訊 */
              close(sockfd);
              exit(0);
            }
            //////////////////////////////httpclient.c 結(jié)束///////////////////////////////////////////

            posted @ 2008-06-30 10:03 隨意門 閱讀(607) | 評(píng)論 (0)編輯 收藏
            csdn上ni_hao搜集的源代碼網(wǎng)站

            優(yōu)秀網(wǎng)站源碼、編程源碼下載網(wǎng)站大集中
            1.51源碼:http://www.51aspx.com/

            2.源碼之家:http://www.codejia.com/

            3.源碼網(wǎng):http://www.codepub.com/

            4.蝦客源碼:http://www.xkxz.com/

            5.多多源碼:http://www.morecode.net/

            6.洪越源代碼:http://www.softhy.net/

            7.鋒網(wǎng)源碼:http://www.fwvv.net/

            8.代碼愛好者:http://www.codefans.com/

            9.愛源碼:http://www.aiyuanma.com/

            10.酷源碼:http://www.kyuanma.com/

            11.搜源碼:http://www.soucode.com/

            12.拉基源碼:http://www.lajicode.com/

            13.源碼開發(fā)網(wǎng):http://www.codedn.com/

            14.源碼天空:http://www.codesky.net/

            15.源碼吧:http://www.asp88.net/

            16.綠色源碼:http://code888.cn/

            17.9號(hào)源碼中心:http://www.9code.com/

            18.網(wǎng)馨源碼:http://www.asppsa.com/

            20.源碼天下:http://www.pccode.net/

            21.需要源碼:http://www.needcode.cn/

            22.華夏源碼:http://www.haocpu.com/

            23.天新網(wǎng):http://codes.21tx.com/

            24.源碼網(wǎng):http://www.yuanma5.com/

            25.無憂源碼:http://www.5uym.com/

            26.中國下載站:http://www.cnz.cc/

            27.資源吧:http://www.ziyuan8.com/

            28.啟明星源碼:http://www.codewww.com/

            29.我要源碼:http://www.xia51.com/

            30.清秋源碼:http://www.asp678.com/

            posted @ 2008-05-30 11:27 隨意門 閱讀(215) | 評(píng)論 (0)編輯 收藏
            精妙SQL語句

            下列語句部分是Mssql語句,不可以在access中使用。

            SQL分類: 
            DDL—數(shù)據(jù)定義語言(CREATE,ALTER,DROP,DECLARE) 
            DML—數(shù)據(jù)操縱語言(SELECT,DELETE,UPDATE,INSERT) 
            DCL—數(shù)據(jù)控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)

            首先,簡(jiǎn)要介紹基礎(chǔ)語句:
            1、說明:創(chuàng)建數(shù)據(jù)庫
            CREATE DATABASE database-name 
            2、說明:刪除數(shù)據(jù)庫
            drop database dbname
            3、說明:備份sql server
            --- 創(chuàng)建 備份數(shù)據(jù)的 device
            USE master
            EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
            --- 開始 備份
            BACKUP DATABASE pubs TO testBack 
            4、說明:創(chuàng)建新表
            create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
            根據(jù)已有的表創(chuàng)建新表: 
            A:create table tab_new like tab_old (使用舊表創(chuàng)建新表)
            B:create table tab_new as select col1,col2… from tab_old definition only
            5、說明:刪除新表drop table tabname 
            6、說明:增加一個(gè)列
            Alter table tabname add column col type
            注:列增加后將不能刪除。DB2中列加上后數(shù)據(jù)類型也不能改變,唯一能改變的是增加varchar類型的長(zhǎng)度。
            7、說明:添加主鍵: Alter table tabname add primary key(col) 
            說明:刪除主鍵: Alter table tabname drop primary key(col) 
            8、說明:創(chuàng)建索引:create [unique] index idxname on tabname(col….) 
            刪除索引:drop index idxname
            注:索引是不可更改的,想更改必須刪除重新建。
            9、說明:創(chuàng)建視圖:create view viewname as select statement 
            刪除視圖:drop view viewname
            10、說明:幾個(gè)簡(jiǎn)單的基本的sql語句
            選擇:select * from table1 where 范圍
            插入:insert into table1(field1,field2) values(value1,value2)
            刪除:delete from table1 where 范圍
            更新:update table1 set field1=value1 where 范圍
            查找:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!
            排序:select * from table1 order by field1,field2 [desc]
            總數(shù):select count * as totalcount from table1
            求和:select sum(field1) as sumvalue from table1
            平均:select avg(field1) as avgvalue from table1
            最大:select max(field1) as maxvalue from table1
            最?。簊elect min(field1) as minvalue from table1
            11、說明:幾個(gè)高級(jí)查詢運(yùn)算詞
            A: UNION 運(yùn)算符 
            UNION 運(yùn)算符通過組合其他兩個(gè)結(jié)果表(例如 TABLE1 和 TABLE2)并消去表中任何重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨  UNION 一起使用時(shí)(即 UNION ALL),不消除重復(fù)行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。 
            B: EXCEPT 運(yùn)算符 
            EXCEPT 運(yùn)算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 EXCEPT 一起使用時(shí) (EXCEPT ALL),不消除重復(fù)行。 
            C: INTERSECT 運(yùn)算符
            INTERSECT 運(yùn)算符通過只包括 TABLE1 和 TABLE2 中都有的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表。當(dāng) ALL 隨 INTERSECT 一起使用時(shí) (INTERSECT ALL),不消除重復(fù)行。 
            注:使用運(yùn)算詞的幾個(gè)查詢結(jié)果行必須是一致的。 
            12、說明:使用外連接 
            A、left outer join: 
            左外連接(左連接):結(jié)果集幾包括連接表的匹配行,也包括左連接表的所有行。 
            SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
            B:right outer join: 
            右外連接(右連接):結(jié)果集既包括連接表的匹配連接行,也包括右連接表的所有行。 
            C:full outer join: 
            全外連接:不僅包括符號(hào)連接表的匹配行,還包括兩個(gè)連接表中的所有記錄。

            其次,大家來看一些不錯(cuò)的sql語句
            1、說明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b) (Access可用)
            法一:select * into b from a where 1 <>1
            法二:select top 0 * into b from a

            2、說明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b) (Access可用)
            insert into b(a, b, c) select d,e,f from b;

            3、說明:跨數(shù)據(jù)庫之間表的拷貝(具體數(shù)據(jù)使用絕對(duì)路徑) (Access可用)
            insert into b(a, b, c) select d,e,f from b in ‘具體數(shù)據(jù)庫’ where 條件
            例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

            4、說明:子查詢(表名1:a 表名2:b)
            select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

            5、說明:顯示文章、提交人和最后回復(fù)時(shí)間
            select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

            6、說明:外連接查詢(表名1:a 表名2:b)
            select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

            7、說明:在線視圖查詢(表名1:a )
            select * from (SELECT a,b,c FROM a) T where t.a > 1;

            8、說明:between的用法,between限制查詢數(shù)據(jù)范圍時(shí)包括了邊界值,not between不包括
            select * from table1 where time between time1 and time2
            select a,b,c, from table1 where a not between 數(shù)值1 and 數(shù)值2

            9、說明:in 的使用方法
            select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

            10、說明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息 
            delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

            11、說明:四表聯(lián)查問題:
            select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

            12、說明:日程安排提前五分鐘提醒 
            SQL: select * from 日程安排 where datediff('minute',f開始時(shí)間,getdate())>5

            13、說明:一條sql 語句搞定數(shù)據(jù)庫分頁
            select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

            14、說明:前10條記錄
            select top 10 * form table1 where 范圍

            15、說明:選擇在每一組b值相同的數(shù)據(jù)中對(duì)應(yīng)的a最大的記錄的所有信息(類似這樣的用法可以用于論壇每月排行榜,每月熱銷產(chǎn)品分析,按科目成績(jī)排名,等等.)
            select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

            16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重復(fù)行而派生出一個(gè)結(jié)果表
            (select a from tableA ) except (select a from tableB) except (select a from tableC)

            17、說明:隨機(jī)取出10條數(shù)據(jù)
            select top 10 * from tablename order by newid()

            18、說明:隨機(jī)選擇記錄
            select newid()

            19、說明:刪除重復(fù)記錄
            Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

            20、說明:列出數(shù)據(jù)庫里所有的表名
            select name from sysobjects where type='U' 

            21、說明:列出表里的所有的
            select name from syscolumns where id=object_id('TableName')

            22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實(shí)現(xiàn)多重選擇,類似select 中的case。
            select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
            顯示結(jié)果:
            type vender pcs
            電腦 A 1
            電腦 A 1
            光盤 B 2
            光盤 A 2
            手機(jī) B 3
            手機(jī) C 3

            23、說明:初始化表table1
            TRUNCATE TABLE table1

            24、說明:選擇從10到15的記錄
            select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
              
            隨機(jī)選擇數(shù)據(jù)庫記錄的方法(使用Randomize函數(shù),通過SQL語句實(shí)現(xiàn))
              對(duì)存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù)來說,隨機(jī)數(shù)特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個(gè)隨機(jī)數(shù)”然后打印出來。實(shí)際上常見的解決方案是建立如下所示的循環(huán): 
            Randomize 
            RNumber = Int(Rnd*499) +1 
             
            While Not objRec.EOF 
            If objRec("ID") = RNumber THEN 
            ... 這里是執(zhí)行腳本 ... 
            end if 
            objRec.MoveNext 
            Wend 
             
            這很容易理解。首先,你取出1到500范圍之內(nèi)的一個(gè)隨機(jī)數(shù)(假設(shè)500就是數(shù)據(jù)庫內(nèi)記錄的總數(shù))。然后,你遍歷每一記錄來測(cè)試ID 的值、檢查其是 否匹配RNumber。滿足條件的話就執(zhí)行由THEN 關(guān)鍵字開始的那一塊代碼。假如你的RNumber 等于495,那么要循環(huán)一遍數(shù)據(jù)庫花的時(shí)間可就 長(zhǎng)了。雖然500這個(gè)數(shù)字看起來大了些,但相比更為穩(wěn)固的企業(yè)解決方案這還是個(gè)小型數(shù)據(jù)庫了,后者通常在一個(gè)數(shù)據(jù)庫內(nèi)就包含了成千上萬條記錄。這時(shí)候不就 死定了? 
              采用SQL,你就可以很快地找出準(zhǔn)確的記錄并且打開一個(gè)只包含該記錄的recordset,如下所示: 
            Randomize 
            RNumber = Int(Rnd*499) + 1 
             
            SQL = "SELECT * FROM Customers WHERE ID = " & RNumber 
             
            set objRec = ObjConn.Execute(SQL) 
            Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 
             
              不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對(duì)以上代碼的工作滿意,你自可按需操作“隨機(jī)”記錄。Recordset沒有包含其他內(nèi)容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時(shí)間。 
            再談隨機(jī)數(shù) 
              現(xiàn)在你下定決心要榨干Random 函數(shù)的最后一滴油,那么你可能會(huì)一次取出多條隨機(jī)記錄或者想采用一定隨機(jī)范圍內(nèi)的記錄。把上面的標(biāo)準(zhǔn)Random 示例擴(kuò)展一下就可以用SQL應(yīng)對(duì)上面兩種情況了。 
              為了取出幾條隨機(jī)選擇的記錄并存放在同一recordset內(nèi),你可以存儲(chǔ)三個(gè)隨機(jī)數(shù),然后查詢數(shù)據(jù)庫獲得匹配這些數(shù)字的記錄: 
            SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 
             
              假如你想選出10條記錄(也許是每次頁面裝載時(shí)的10條鏈接的列表),你可以用BETWEEN 或者數(shù)學(xué)等式選出第一條記錄和適當(dāng)數(shù)量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動(dòng)生成的號(hào)碼): 
            SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9" 

              注意:以上代碼的執(zhí)行目的不是檢查數(shù)據(jù)庫內(nèi)是否有9條并發(fā)記錄。

             
            隨機(jī)讀取若干條記錄,測(cè)試過
            Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
            Sql server:select top n * from 表名 order by newid()
            mysqlelect * From 表名 Order By rand() Limit n
            Access左連接語法(最近開發(fā)要用左連接,Access幫助什么都沒有,網(wǎng)上沒有Access的SQL說明,只有自己測(cè)試, 現(xiàn)在記下以備后查)
            語法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
            使用SQL語句 用...代替過長(zhǎng)的字符串顯示
            語法:
            SQL數(shù)據(jù)庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
            Access數(shù)據(jù)庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; 
             
            Conn.Execute說明
            Execute方法
              該方法用于執(zhí)行SQL語句。根據(jù)SQL語句執(zhí)行后是否返回記錄集,該方法的使用格式分為以下兩種:
                1.執(zhí)行SQL查詢語句時(shí),將返回查詢得到的記錄集。用法為:
                Set 對(duì)象變量名=連接對(duì)象.Execute("SQL 查詢語言")
               Execute方法調(diào)用后,會(huì)自動(dòng)創(chuàng)建記錄集對(duì)象,并將查詢結(jié)果存儲(chǔ)在該記錄對(duì)象中,通過Set方法,將記錄集賦給指定的對(duì)象保存,以后對(duì)象變量就代表了該記錄集對(duì)象。

                2.執(zhí)行SQL的操作性語言時(shí),沒有記錄集的返回。此時(shí)用法為:
                連接對(duì)象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
                  ·RecordAffected 為可選項(xiàng),此出可放置一個(gè)變量,SQL語句執(zhí)行后,所生效的記錄數(shù)會(huì)自動(dòng)保存到該變量中。通過訪問該變量,就可知道SQL語句隊(duì)多少條記錄進(jìn)行了操作。
                  ·Option 可選項(xiàng),該參數(shù)的取值通常為adCMDText,它用于告訴ADO,應(yīng)該將Execute方法之后的第一個(gè)字符解釋為命令文本。通過指定該參數(shù),可使執(zhí)行更高效。

            ·BeginTrans、RollbackTrans、CommitTrans方法

            posted @ 2008-05-21 15:20 隨意門 閱讀(248) | 評(píng)論 (0)編輯 收藏
            MySQL 5 C API 訪問數(shù)據(jù)庫例子程序

            /*****************************************************************
            以下是研究 mysql 5.0 得出的結(jié)果,描述并使用標(biāo)準(zhǔn) c 演示了使用 MySQL
            C API 函數(shù) 簡(jiǎn)單操作數(shù)據(jù)庫的流程;
            例子程序在 VC6 windows 2000 上調(diào)試通過
            *****************************************************************/

            #include <windows.h>
            #include <iostream>
            #include <mysql.h> //文件位于 MySQL 提供的 C API 目錄中
            using namespace std; 中國開源社區(qū)www.ossforge.com

            // linux 等系統(tǒng)中請(qǐng)加入 -lmysql
            #pragma comment( lib, "libmysql.lib")

            中國開源社區(qū)www.ossforge.com


            /*****************************************************************/
            ///name : main
            //function : 主測(cè)試函數(shù)
            //access : private
            //para :
            // 1. : int argc
            // : 系統(tǒng)參數(shù)個(gè)數(shù)
            // 2. : char * argv[]
            // : 參數(shù)數(shù)值
            //return : 返回給 startup 函數(shù)的退出參數(shù)
            //author : hzh
            //date : 2006-06-24
            /*****************************************************************/
            int main( int argc, char * argv[] )
            {
            MYSQL mydata; 中國開源社區(qū)www.openforge.cn

            //初始化數(shù)據(jù)結(jié)構(gòu)
            if(mysql_init(&mydata) == NULL)
            {
            std::cout<<"init mysql data stauct fail"<<endl;
            return -1;
            }

            //連接數(shù)據(jù)庫
            if(argc == 1)
            {
            if(NULL == mysql_real_connect(&mydata,"127.0.0.1","root","mysql5",
            "hzhdb",MYSQL_PORT,NULL,0))
            {
            std::cout<<"connect database fail"<<endl<<mysql_error(&mydata)<<endl;
            return -1;
            }
            }else if(argc == 5)
            {
            if(NULL == mysql_real_connect(&mydata,argv[1],
            argv[2],argv[3],argv[4],MYSQL_PORT,NULL,0))
            {
            std::cout<<"connect database fail"<<endl<<mysql_error(&mydata)<<endl;
            return -1;
            }
            }
            else
            {
            std::cout<<"run parameter error"<<endl;
            return -1;
            } 中國開源社區(qū)www.openforge.cn

            std::string s_sql = "drop table hzhtest";
            if(mysql_query(&mydata,s_sql.c_str()) != 0)
            {
            //刪除表失敗
            mysql_close(&mydata);
            std::cout<<"drop table fail"<<endl<<mysql_error(&mydata)<<endl;
            }

            中國開源社區(qū)www.ossforge.com

            //創(chuàng)建數(shù)據(jù)表,字段 myid 設(shè)置了自增列屬性
            s_sql = "create table hzhtest(";
            s_sql = "myid integer not null auto_increment,";
            s_sql = "mytime datetime null,myname varchar(30),";
            s_sql = " primary key(myid))";
            if(mysql_query(&mydata,s_sql.c_str()) != 0)
            {
            //創(chuàng)建表失敗
            mysql_close(&mydata);
            std::cout<<"create table fail"<<endl
            <<mysql_error(&mydata)<<endl;
            return -1;
            } 中國開源社區(qū)www.openforge.cn

            //向表中插入數(shù)據(jù)
            for(int k = 1; k < 30; k)
            {
            s_sql = "insert into hzhtest(mytime,myname) values";
            s_sql = "('2006-06-";
            char buff[20];
            memset(buff,0,sizeof(buff));
            itoa(k,buff,10);
            s_sql = buff;

            中國開源社區(qū)www.ossforge.com

            s_sql = " ";

            中國開源社區(qū)www.openforge.cn

            int i = k % 3;
            memset(buff,0,sizeof(buff));
            itoa(i,buff,10);
            s_sql = buff;
            s_sql = ":01:01'"; 中國開源社區(qū)www.ossforge.com

            if(i == 0)
            {
            s_sql = ",NULL";
            }
            else
            {
            s_sql = ",'黃志輝";
            s_sql = buff;
            s_sql = "'";
            }
            s_sql = ")"; 中國開源社區(qū)www.openforge.cn

            if(mysql_query(&mydata,s_sql.c_str()) != 0)
            {
            //執(zhí)行SQL語句出錯(cuò)
            std::cout<<"execute insert syntax fail"<<
            endl<<mysql_error(&mydata)<<endl;
            mysql_close(&mydata) ;
            return -1;
            }
            }

            中國開源社區(qū)www.openforge.cn

            //查詢數(shù)據(jù)并顯示
            s_sql = "select myid,mytime,myname from hzhtest";
            if(mysql_query(&mydata,s_sql.c_str()) != 0)
            {
            //執(zhí)行SQL語句出錯(cuò)
            mysql_close(&mydata);
            std::cout<<"execute sql syntax fail"<<
            endl<<mysql_error(&mydata)<<endl;
            return -1;
            } 中國開源社區(qū)www.ossforge.com


            MYSQL_RES *result = mysql_store_result(&mydata);

            中國開源社區(qū)www.ossforge.com

            //取得查詢結(jié)果
            int rowcount = mysql_num_rows(result);
            //取得有效記錄數(shù)
            std::cout<<"exec sql: "<<s_sql.c_str()<<",row count: "<<rowcount<<endl;

            中國開源社區(qū)www.openforge.cn

            MYSQL_FIELD *fields = NULL;
            //取得各字段名
            for(int i = 0; fields = mysql_fetch_field(result); i)
            {
            std::cout<<fields->name<<"\t\t";
            }
            std::cout<<endl; 中國開源社區(qū)www.ossforge.com


            //依次讀取各條記錄
            MYSQL_ROW currrow = NULL;
            while((currrow = mysql_fetch_row(result)) != NULL)
            {
            //讀行的記錄
            for(int i = 0; i < mysql_num_fields(result); i)
            {
            std::cout<<(currrow[i] ? currrow[i] : "NULL")<<"\t";
            }
            std::cout<<endl;
            } 中國開源社區(qū)www.openforge.cn

            mysql_free_result(result) ;

            mysql_close(&mydata);

            system("pause"); 中國開源社區(qū)www.ossforge.com

            return 1;
            }

            posted @ 2008-05-19 10:42 隨意門 閱讀(238) | 評(píng)論 (0)編輯 收藏
            基于C API的MySQL數(shù)據(jù)庫多線程訪問方法

            摘要:目前,數(shù)據(jù)庫在各行各業(yè)中廣泛應(yīng)用。在眾多商業(yè)數(shù)據(jù)庫軟件中,SQL SERVER 和ORACLE被較多的使用,因此這兩個(gè)數(shù)據(jù)庫軟件的價(jià)格也較昂貴。本文主要介紹MySQL數(shù)據(jù)庫在單線程或多線程程序環(huán)境下使用C API訪問MySQL數(shù)據(jù)庫方法,并給出了相應(yīng)代碼和分析。該數(shù)據(jù)庫屬于開源數(shù)據(jù)庫,具有較高的成熟度,并且對(duì)于社區(qū)版本可以免費(fèi)使用,因此對(duì)于需要使用 C API訪問數(shù)據(jù)庫的項(xiàng)目開發(fā),可降低開發(fā)成本。
              關(guān)鍵詞:MySQL;C API;多線程
              中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2007)16-30904-02
              Based on C API MySQL Database Multi-threaded Access Methods
              YU Cheng-gong
              (Zhejiang Pharmaceutical College,Ningbo 315100,China)
              Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
              Key words:MySQL;C API;multi-threaded

              1 引言

              隨著社會(huì)信息化的深入,數(shù)據(jù)庫在社會(huì)各個(gè)領(lǐng)域被廣泛應(yīng)用。在這些數(shù)據(jù)庫應(yīng)用項(xiàng)目開發(fā)過程中,需要做兩方面的決策:1. 使用何種數(shù)據(jù)庫軟件;2. 采用何種方式訪問數(shù)據(jù)庫。數(shù)據(jù)庫軟件的選擇面比較寬,在目前眾多商業(yè)數(shù)據(jù)庫軟件中,SQL SERVER 和ORACLE被較多的使用,當(dāng)然這兩個(gè)數(shù)據(jù)庫軟件的價(jià)格也較昂貴,本文選擇可免費(fèi)使用的MySQL數(shù)據(jù)庫社區(qū)版本,MySQL庫屬于開源數(shù)據(jù)庫,具有較 高的成熟度和可靠性。數(shù)據(jù)庫的訪問方式有很多,可以使用ODBC、DAO、ADO等方法,這些方法簡(jiǎn)單直接但是效率不高,不適合大型復(fù)雜的系統(tǒng)使用,例如 網(wǎng)絡(luò)游戲的數(shù)據(jù)庫系統(tǒng)開發(fā)需要考慮同時(shí)大量的數(shù)據(jù)庫訪問,因此訪問的效率非常重要?;贑程序語言的高效率,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率?;谝陨蟽牲c(diǎn),本文將介紹基于C API的MySQL數(shù)據(jù)庫訪問方法,給出在單線程和多線程程序環(huán)境下的具體代碼和分析。

              2 建表

              為了方便說明數(shù)據(jù)庫的訪問,先建立一個(gè)數(shù)據(jù)庫表TestTable,可以使用SQL語句創(chuàng)建該表,也可以使用MySQL提供的圖形界面來創(chuàng)建。數(shù)據(jù)庫表中字段如下:
              該數(shù)據(jù)庫表使用最常見的用戶名和密碼作為字段,本文將通過該表來實(shí)現(xiàn)不同程序環(huán)境下基于C API的數(shù)據(jù)庫的訪問方法。

              3 單線程程序的數(shù)據(jù)庫訪問

              單線程應(yīng)用程序訪問MySQL數(shù)據(jù)庫相對(duì)簡(jiǎn)單,其過程包含以下幾步:
              (1)初始化MySQL庫
              (2)初始化數(shù)據(jù)庫連接句柄
              (3)連接數(shù)據(jù)庫
              (4)通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
              (5)關(guān)閉數(shù)據(jù)庫連接
              (6)結(jié)束MySQL庫
              通過這五個(gè)步驟即可實(shí)現(xiàn)數(shù)據(jù)庫的訪問,具體代碼和分析如下:
              //在main主函數(shù)中添加代碼
              //1.定義訪問數(shù)據(jù)庫所需變量
              MYSQL * myData;
              MYSQL_RES * res;
              MYSQL_ROW row;
              //2. 初始化MySQL庫和數(shù)據(jù)庫連接句柄
              myData = mysql_init((MYSQL*) 0);
              //3. 連接數(shù)據(jù)庫,MYSQL_IP和MYSQL_PORT表示數(shù)據(jù)庫的IP和端口
              // MYSQL_ACCOUNT, MYSQL_PASSWORD表示數(shù)據(jù)庫連接的帳號(hào)和密碼
              //MYSQL_DBNAME表示所要訪問的數(shù)據(jù)庫名
              mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
              //4. 通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
              //4.1新建用戶名為abcdef,密碼為123456的記錄
              mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
              //4.2顯示所有記錄
              //查詢所有記錄
              mysql_query(myData, "select * from TestTable");
              //將查詢結(jié)果保存到res中
              res = mysql_store_result( myData ) ;
              //逐條顯示記錄
              Int j = 0;
              while ( row = mysql_fetch_row( res ) ) {//獲取一條記錄
              j = mysql_num_fields( res ) ;//獲取每條記錄的字段數(shù)
            for ( k = 0 ; k < j ; k++ )
              printf( “%s”, row[k] ) ;
              printf( “\n”) ;
              }
              //釋放res
              mysql_free_result( res ) ;
              //5. 關(guān)閉數(shù)據(jù)庫連接
              mysql_close( myData );
              //6. 結(jié)束MySQL庫
              mysql_library_end();
              關(guān)于代碼的幾點(diǎn)說明:
              (1)定義變量中的三個(gè)數(shù)據(jù)結(jié)構(gòu)為訪問MySQL所需,MYSQL結(jié)構(gòu)表示一個(gè)數(shù)據(jù)庫連接的句柄,其中包含了數(shù)據(jù)庫連接所需的參數(shù),MYSQL_RES結(jié)構(gòu)表示數(shù)據(jù)庫訪問中一個(gè)查詢的返回結(jié)果,MYSQL_ROW結(jié)構(gòu)表示返回結(jié)構(gòu)中的一條記錄;
              (2)獲取查詢結(jié)果res并處理完畢,必須釋放res,否則會(huì)造成內(nèi)存泄露
              (3)在單線程時(shí),步驟初始化MySQL庫和數(shù)據(jù)庫連接句柄可合并, 由mysql_init()來處理。該函數(shù)會(huì)自動(dòng)調(diào)用函數(shù)mysql_library_init()來初始化MySQL庫,同時(shí)初始化連接句柄。

              4 多線程環(huán)境下的數(shù)據(jù)庫訪問

              多線程環(huán)境下的數(shù)據(jù)庫訪問需要保證線程安全。Windows版本的MySQL C API函數(shù)都是線程安全的,除了mysql_library_init(),而我們剛才的代碼中使用的mysql_init()函數(shù)會(huì)自動(dòng)調(diào)用函數(shù) mysql_library_init()來初始化MySQL庫,因此在多線程環(huán)境下,需要不同的初始化代碼和清理代碼。具體過程如下:
              (1)在主函數(shù)中調(diào)用mysql_library_init()來初始化MySQL庫;
              (2)啟動(dòng)各數(shù)據(jù)庫訪問線程
              (3)主函數(shù)等待各個(gè)線程的結(jié)束
              (4)調(diào)用mysql_library_end ()清理MySQL庫。
              其中數(shù)據(jù)庫訪問線程的代碼和單線程數(shù)據(jù)庫訪問代碼類似,但是需要如下變化:
              (1)單線程中的第2步初始化MySQL庫和數(shù)據(jù)庫連接句柄,不能再使用mysql_init(),代碼應(yīng)作如下修改:
              //初始化線程
              my_init();
              mysql_thread_init();
              //初始化myData
              myData = malloc(sizeof(MYSQL));
              memset(&myData, 0, sizeof(MYSQL))
              (2)上述初始化myData,只是將myData所有成員設(shè)為0,如果有需要可以根據(jù)具體情況設(shè)置該結(jié)構(gòu)成員的值,例myData->reconnect= 1,其作用是設(shè)置數(shù)據(jù)庫連接屬性為重連接,即當(dāng)數(shù)據(jù)庫連接斷開時(shí),自動(dòng)重新連接;
              (3)單線程中的第6步不在需要,改為結(jié)束線程的清理工作,即調(diào)用mysql_thread_end()函數(shù)。

              5 總結(jié)

              綜上所述,使用C API訪問MySQL數(shù)據(jù)庫在不同線程環(huán)境下的區(qū)別主要在于初始化和訪問結(jié)束后清理代碼,也就是說除了初始化和清理代碼,MySQL提供給我們的C API函數(shù)都是線程安全的。最后需要有一點(diǎn)說明,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率,但并不是所有的數(shù)據(jù)庫項(xiàng)目都適合這種方式,該方式適合需要大量實(shí)時(shí)并發(fā)處理的數(shù)據(jù)庫項(xiàng)目,例如網(wǎng)絡(luò)游戲的數(shù)據(jù) 庫項(xiàng)目,對(duì)于有此需求的數(shù)據(jù)庫項(xiàng)目可參考本文。

              參考文獻(xiàn):
              [1]MySQL AB,MySQL 5.0 Reference Manual.

              注:“本文中所涉及到的圖表、公式注解等形式請(qǐng)以PDF格式閱讀原文。”

            posted @ 2008-04-22 16:35 隨意門 閱讀(5030) | 評(píng)論 (1)編輯 收藏
            如何開啟系統(tǒng)端口

            如何開啟系統(tǒng)端口

            --------------------------------------------------------------------------------
            win本身大部分的端口應(yīng)該都是開的吧,只能是關(guān)哪個(gè)端口。

            試試這片文章:
            查看端口
            在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令:

            依次點(diǎn)擊“開始→運(yùn)行”,鍵入“cmd”并回車,打開命令提示符窗口。在命令提示符狀態(tài)下鍵入“netstat -a -n”,按下回車鍵后就可以看到以數(shù)字形式顯示的TCP和UDP連接的端口號(hào)及狀態(tài)。

            小知識(shí):Netstat命令用法
            命令格式:Netstat -a -e -n -o -s

            -a 表示顯示所有活動(dòng)的TCP連接以及計(jì)算機(jī)監(jiān)聽的TCP和UDP端口。

            -e 表示顯示以太網(wǎng)發(fā)送和接收的字節(jié)數(shù)、數(shù)據(jù)包數(shù)等。

            -n 表示只以數(shù)字形式顯示所有活動(dòng)的TCP連接的地址和端口號(hào)。

            -o 表示顯示活動(dòng)的TCP連接并包括每個(gè)連接的進(jìn)程ID(PID)。

            -s 表示按協(xié)議顯示各種連接的統(tǒng)計(jì)信息,包括端口號(hào)。

            關(guān)閉/開啟端口
            在介紹各種端口的作用前,這里先介紹一下在Windows中如何關(guān)閉/打開端口,因?yàn)槟J(rèn)的情況下,有很多不安全的或沒有什么用的端口是開啟的, 比如Telnet服務(wù)的23端口、FTP服務(wù)的21端口、SMTP服務(wù)的25端口、RPC服務(wù)的135端口等等。為了保證系統(tǒng)的安全性,我們可以通過下面 的方法來關(guān)閉/開啟端口。

            關(guān)閉端口
            比如在Windows 2000/XP中關(guān)閉SMTP服務(wù)的25端口,可以這樣做:首先打開“控制面板”,雙擊“管理工具”,再雙擊“服務(wù)”。接著在打開的服務(wù)窗口中找到并雙擊 “Simple Mail Transfer Protocol (SMTP)”服務(wù),單擊“停止”按鈕來停止該服務(wù),然后在“啟動(dòng)類型”中選擇“已禁用”,最后單擊“確定”按鈕即可。這樣,關(guān)閉了SMTP服務(wù)就相當(dāng)于 關(guān)閉了對(duì)應(yīng)的端口。

            開啟端口
            如果要開啟該端口只要先在“啟動(dòng)類型”選擇“自動(dòng)”,單擊“確定”按鈕,再打開該服務(wù),在“服務(wù)狀態(tài)”中單擊“啟動(dòng)”按鈕即可啟用該端口,最后,單擊“確定”按鈕即可。



            21端口:21端口主要用于FTP(File Transfer Protocol,文件傳輸協(xié)議)服務(wù)。 23端口:23端口主要用于Telnet(遠(yuǎn)程登錄)服務(wù),是Internet上普遍采用的登錄和仿真程序。 25端口:25端口為SMTP(Simple Mail Transfer Protocol,簡(jiǎn)單郵件傳輸協(xié)議)服務(wù)器所開放,主要用于發(fā)送郵件,如今絕大多數(shù)郵件服務(wù)器都使用該協(xié)議。 53端口:53端口為DNS(Domain Name Server,域名服務(wù)器)服務(wù)器所開放,主要用于域名解析,DNS服務(wù)在NT系統(tǒng)中使用的最為廣泛。 67、68端口:67、68端口分別是為Bootp服務(wù)的Bootstrap Protocol Server(引導(dǎo)程序協(xié)議服務(wù)端)和Bootstrap Protocol Client(引導(dǎo)程序協(xié)議客戶端)開放的端口。 69端口:TFTP是Cisco公司開發(fā)的一個(gè)簡(jiǎn)單文件傳輸協(xié)議,類似于FTP。 79端口:79端口是為Finger服務(wù)開放的,主要用于查詢遠(yuǎn)程主機(jī)在線用戶、操作系統(tǒng)類型以及是否緩沖區(qū)溢出等用戶的詳細(xì)信息。 80端口:80端口是為HTTP(HyperText Transport Protocol,超文本傳輸協(xié)議)開放的,這是上網(wǎng)沖浪使用最多的協(xié)議,主要用于在WWW(World Wide Web,萬維網(wǎng))服務(wù)上傳輸信息的協(xié)議。 99端口:99端口是用于一個(gè)名為“Metagram Relay”(亞對(duì)策延時(shí))的服務(wù),該服務(wù)比較少見,一般是用不到的。 109、110端口:109端口是為POP2(Post Office Protocol Version 2,郵局協(xié)議2)服務(wù)開放的,110端口是為POP3(郵件協(xié)議3)服務(wù)開放的,POP2、POP3都是主要用于接收郵件的。 111端口:111端口是SUN公司的RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)服務(wù)所開放的端口,主要用于分布式系統(tǒng)中不同計(jì)算機(jī)的內(nèi)部進(jìn)程通信,RPC在多種網(wǎng)絡(luò)服務(wù)中都是很重要的組件。 113端口:113端口主要用于Windows的“Authentication Service”(驗(yàn)證服務(wù))。 119端口:119端口是為“Network News Transfer Protocol”(網(wǎng)絡(luò)新聞組傳輸協(xié)議,簡(jiǎn)稱NNTP)開放的。 135端口:135端口主要用于使用RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)協(xié)議并提供DCOM(分布式組件對(duì)象模型)服務(wù)。 137端口:137端口主要用于“NetBIOS Name Service”(NetBIOS名稱服務(wù))。 139端口:139端口是為“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印機(jī)共享以及Unix中的Samba服務(wù)。 143端口:143端口主要是用于“Internet Message Access Protocol”v2(Internet消息訪問協(xié)議,簡(jiǎn)稱IMAP)。 161端口:161端口是用于“Simple Network Management Protocol”(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議,簡(jiǎn)稱SNMP)。 443端口:43端口即網(wǎng)頁瀏覽端口,主要是用于HTTPS服務(wù),是提供加密和通過安全端口傳輸?shù)牧硪环NHTTP。 554端口:554端口默認(rèn)情況下用于“Real Time Streaming Protocol”(實(shí)時(shí)流協(xié)議,簡(jiǎn)稱RTSP)。 1024端口:1024端口一般不固定分配給某個(gè)服務(wù),在英文中的解釋是“Reserved”(保留)。 1080端口:1080端口是Socks代理服務(wù)使用的端口,大家平時(shí)上網(wǎng)使用的WWW服務(wù)使用的是HTTP協(xié)議的代理服務(wù)。 1755端口:1755端口默認(rèn)情況下用于“Microsoft Media Server”(微軟媒體服務(wù)器,簡(jiǎn)稱MMS)。 4000端口:4000端口是用于大家經(jīng)常使用的QQ聊天工具的,再細(xì)說就是為QQ客戶端開放的端口,QQ服務(wù)端使用的端口是8000。 5554端口:在今年4月30日就報(bào)道出現(xiàn)了一種針對(duì)微軟lsass服務(wù)的新蠕蟲病毒——震蕩波(Worm.Sasser),該病毒可以利用TCP 5554端口開啟一個(gè)FTP服務(wù),主要被用于病毒的傳播。 5632端口:5632端口是被大家所熟悉的遠(yuǎn)程控制軟件pcAnywhere所開啟的端口。 8080端口:8080端口同80端口,是被用于WWW代理服務(wù)的,可以實(shí)現(xiàn)網(wǎng)頁端口概念 在網(wǎng)絡(luò)技術(shù)中,端口(Port)大致有兩種意思:一是物理意義上的端口,比如,ADSL Modem、集線器、交換機(jī)、路由器用于連接其他網(wǎng)絡(luò)設(shè)備的接口,如RJ-45端口、SC端口等等。二是邏輯意義上的端口,一般是指TCP/IP協(xié)議中的 端口,端口號(hào)的范圍從0到65535,比如用于瀏覽網(wǎng)頁服務(wù)的80端口,用于FTP服務(wù)的21端口等等。我們這里將要介紹的就是邏輯意義上的端口。 端口分類 邏輯意義上的端口有多種分類標(biāo)準(zhǔn),下面將介紹兩種常見的分類: 1. 按端口號(hào)分布劃分 (1)知名端口(Well-Known Ports) 知名端口即眾所周知的端口號(hào),范圍從0到1023,這些端口號(hào)一般固定分配給一些服務(wù)。比如21端口分配給FTP服務(wù),25端口分配給SMTP(簡(jiǎn)單郵件 傳輸協(xié)議)服務(wù),80端口分配給HTTP服務(wù),135端口分配給RPC(遠(yuǎn)程過程調(diào)用)服務(wù)等等。 (2)動(dòng)態(tài)端口(Dynamic Ports) 動(dòng)態(tài)端口的范圍從1024到65535,這些端口號(hào)一般不固定分配給某個(gè)服務(wù),也就是說許多服務(wù)都可以使用這些端口。只要運(yùn)行的程序向系統(tǒng)提出訪問網(wǎng)絡(luò)的 申請(qǐng),那么系統(tǒng)就可以從這些端口號(hào)中分配一個(gè)供該程序使用。比如1024端口就是分配給第一個(gè)向系統(tǒng)發(fā)出申請(qǐng)的程序。在關(guān)閉程序進(jìn)程后,就會(huì)釋放所占用的 端口號(hào)。 不過,動(dòng)態(tài)端口也常常被病毒木馬程序所利用,如冰河默認(rèn)連接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。 2. 按協(xié)議類型劃分 按協(xié)議類型劃分,可以分為TCP、UDP、IP和ICMP(Internet控制消息協(xié)議)等端口。下面主要介紹TCP和UDP端口: (1)TCP端口 TCP端口,即傳輸控制協(xié)議端口,需要在客戶端和服務(wù)器之間建立連接,這樣可以提供可靠的數(shù)據(jù)傳輸。常見的包括FTP服務(wù)的21端口,Telnet服務(wù)的 23端口,SMTP服務(wù)的25端口,以及HTTP服務(wù)的80端口等等。 (2)UDP端口 UDP端口,即用戶數(shù)據(jù)包協(xié)議端口,無需在客戶端和服務(wù)器之間建立連接,安全性得不到保障。常見的有DNS服務(wù)的53端口,SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議) 服務(wù)的161端口,QQ使用的8000和4000端口等等。查看端口 在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令: 依次點(diǎn)擊“開始→運(yùn)行”,鍵入“cmd”并回車,打開命令提示符窗口。在命令提示符狀態(tài)下鍵入“netstat -a -n”,按下回車鍵后就可以看到以數(shù)字形式顯示的TCP和UDP連接的端口號(hào)及狀態(tài)(如圖)。 小知識(shí):Netstat命令用法 命令格式:Netstat -a -e -n -o -s -a 表示顯示所有活動(dòng)的TCP連接以及計(jì)算機(jī)監(jiān)聽的TCP和UDP端口。 -e 表示顯示以太網(wǎng)發(fā)送和接收的字節(jié)數(shù)、數(shù)據(jù)包數(shù)等。 -n 表示只以數(shù)字形式顯示所有活動(dòng)的TCP連接的地址和端口號(hào)。 -o 表示顯示活動(dòng)的TCP連接并包括每個(gè)連接的進(jìn)程ID(PID)。 -s 表示按協(xié)議顯示各種連接的統(tǒng)計(jì)信息,包括端口號(hào)。 關(guān)閉/開啟端口 在介紹各種端口的作用前,這里先介紹一下在Windows中如何關(guān)閉/打開端口,因?yàn)槟J(rèn)的情況下,有很多不安全的或沒有什么用的端口是開啟的,比如 Telnet服務(wù)的23端口、FTP服務(wù)的21端口、SMTP服務(wù)的25端口、RPC服務(wù)的135端口等等。為了保證系統(tǒng)的安全性,我們可以通過下面的方 法來關(guān)閉/開啟端口。 關(guān)閉端口 比如在Windows 2000/XP中關(guān)閉SMTP服務(wù)的25端口,可以這樣做:首先打開“控制面板”,雙擊“管理工具”,再雙擊“服務(wù)”。接著在打開的服務(wù)窗口中找到并雙擊 “Simple Mail Transfer Protocol (SMTP)”服務(wù),單擊“停止”按鈕來停止該服務(wù),然后在“啟動(dòng)類型”中選擇“已禁用”,最后單擊“確定”按鈕即可。這樣,關(guān)閉了SMTP服務(wù)就相當(dāng)于 關(guān)閉了對(duì)應(yīng)的端口。 開啟端口 如果要開啟該端口只要先在“啟動(dòng)類型”選擇“自動(dòng)”,單擊“確定”按鈕,再打開該服務(wù),在“服務(wù)狀態(tài)”中單擊“啟動(dòng)”按鈕即可啟用該端口,最后,單擊“確 定”按鈕即可。 提示:在Windows 98中沒有“服務(wù)”選項(xiàng),你可以使用防火墻的規(guī)則設(shè)置功能來關(guān)閉/開啟端口。 79端口 端口說明:79端口是為Finger服務(wù)開放的,主要用于查詢遠(yuǎn)程主機(jī)在線用戶、操作系統(tǒng)類型以及是否緩沖區(qū)溢出等用戶的詳細(xì)信息。比如要顯示遠(yuǎn)程計(jì)算機(jī)www.abc.com上的user01用戶的信息,可以在命令行中鍵入“finger user01@www.abc.com” 即可。 端口漏洞:一般黑客要攻擊對(duì)方的計(jì)算機(jī),都是通過相應(yīng)的端口掃描工具來獲得相關(guān)信息,比如使用“流光”就可以利用79端口來掃描遠(yuǎn)程計(jì)算機(jī)操作系統(tǒng)版本, 獲得用戶信息,還能探測(cè)已知的緩沖區(qū)溢出錯(cuò)誤。這樣,就容易遭遇到黑客的攻擊。而且,79端口還被Firehotcker木馬作為默認(rèn)的端口。 操作建議:建議關(guān)閉該端口。 80端口 端口說明:80端口是為HTTP(HyperText Transport Protocol,超文本傳輸協(xié)議)開放的,這是上網(wǎng)沖浪使用最多的協(xié)議,主要用于在WWW(World Wide Web,萬維網(wǎng))服務(wù)上傳輸信息的協(xié)議。我們可以通過HTTP地址加“:80”(即常說的“網(wǎng)址”)來訪問網(wǎng)站的,比如http://www.cce.com.cn:80, 因?yàn)闉g覽網(wǎng)頁服務(wù)默認(rèn)的端口號(hào)是80,所以只要輸入網(wǎng)址,不用輸入“:80”。 端口漏洞:有些木馬程序可以利用80端口來攻擊計(jì)算機(jī)的,比如Executor、RingZero等。 操作建議:為了能正常上網(wǎng)沖浪,我們必須開啟80端口。 109與110端口 端口說明:109端口是為POP2(Post Office Protocol Version 2,郵局協(xié)議2)服務(wù)開放的,110端口是為POP3(郵件協(xié)議3)服務(wù)開放的,POP2、POP3都是主要用于接收郵件的,目前POP3使用的比較多, 許多服務(wù)器都同時(shí)支持POP2和POP3??蛻舳丝梢允褂肞OP3協(xié)議來訪問服務(wù)端的郵件服務(wù),如今ISP的絕大多數(shù)郵件服務(wù)器都是使用該協(xié)議。在使用電 子郵件客戶端程序的時(shí)候,會(huì)要求輸入POP3服務(wù)器地址,默認(rèn)情況下使用的就是110端口(如圖)。 端口漏洞:POP2、POP3在提供郵件接收服務(wù)的同時(shí),也出現(xiàn)了不少的漏洞。單單POP3服務(wù)在用戶名和密碼交換緩沖區(qū)溢出的漏洞就不少于20個(gè),比如 WebEasyMail POP3 Server合法用戶名信息泄露漏洞,通過該漏洞遠(yuǎn)程攻擊者可以驗(yàn)證用戶賬戶的存在。另外,110端口也被ProMail trojan等木馬程序所利用,通過110端口可以竊取POP賬號(hào)用戶名和密碼。 操作建議:如果是執(zhí)行郵件服務(wù)器,可以打開該端口。 135端口 端口說明:135端口主要用于使用RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)協(xié)議并提供DCOM(分布式組件對(duì)象模型)服務(wù),通過RPC可以保證在一臺(tái)計(jì)算機(jī)上運(yùn)行的程序可以順利地執(zhí)行遠(yuǎn)程計(jì)算機(jī)上的代 碼;使用DCOM可以通過網(wǎng)絡(luò)直接進(jìn)行通信,能夠跨包括HTTP協(xié)議在內(nèi)的多種網(wǎng)絡(luò)傳輸。 端口漏洞:相信去年很多Windows 2000和Windows XP用戶都中了“沖擊波”病毒,該病毒就是利用RPC漏洞來攻擊計(jì)算機(jī)的。RPC本身在處理通過TCP/IP的消息交換部分有一個(gè)漏洞,該漏洞是由于錯(cuò)誤 地處理格式不正確的消息造成的。該漏洞會(huì)影響到RPC與DCOM之間的一個(gè)接口,該接口偵聽的端口就是135。 操作建議:為了避免“沖擊波”病毒的攻擊,建議關(guān)閉該端口 137端口 端口說明:137端口主要用于“NetBIOS Name Service”(NetBIOS名稱服務(wù)),屬于UDP端口,使用者只需要向局域網(wǎng)或互聯(lián)網(wǎng)上的某臺(tái)計(jì)算機(jī)的137端口發(fā)送一個(gè)請(qǐng)求,就可以獲取該計(jì)算 機(jī)的名稱、注冊(cè)用戶名,以及是否安裝主域控制器、IIS是否正在運(yùn)行等信息。 端口漏洞:因?yàn)槭荱DP端口,對(duì)于攻擊者來說,通過發(fā)送請(qǐng)求很容易就獲取目標(biāo)計(jì)算機(jī)的相關(guān)信息,有些信息是直接可以被利用,并分析漏洞的,比如IIS服 務(wù)。另外,通過捕獲正在利用137端口進(jìn)行通信的信息包,還可能得到目標(biāo)計(jì)算機(jī)的啟動(dòng)和關(guān)閉的時(shí)間,這樣就可以利用專門的工具來攻擊。 操作建議:建議關(guān)閉該端口。 139端口 端口說明:139端口是為“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印機(jī)共享以及Unix中的Samba服務(wù)。在Windows中要在局域網(wǎng)中進(jìn)行文件的共享, 必須使用該服務(wù)。比如在Windows 98中,可以打開“控制面板”,雙擊“網(wǎng)絡(luò)”圖標(biāo),在“配置”選項(xiàng)卡中單擊“文件及打印共享”按鈕選中相應(yīng)的設(shè)置就可以安裝啟用該服務(wù);在Windows 2000/XP中,可以打開“控制面板”,雙擊“網(wǎng)絡(luò)連接”圖標(biāo),打開本地連接屬性;接著,在屬性窗口的“常規(guī)”選項(xiàng)卡中選擇“Internet協(xié)議 (TCP/IP)”,單擊“屬性”按鈕;然后在打開的窗口中,單擊“高級(jí)”按鈕;在“高級(jí)TCP/IP設(shè)置”窗口中選擇“WINS”選項(xiàng)卡,在 “NetBIOS設(shè)置”區(qū)域中啟用TCP/IP上的NetBIOS。 端口漏洞:開啟139端口雖然可以提供共享服務(wù),但是常常被攻擊者所利用進(jìn)行攻擊,比如使用流光、SuperScan等端口掃描工具,可以掃描目標(biāo)計(jì)算機(jī) 的139端口,如果發(fā)現(xiàn)有漏洞,可以試圖獲取用戶名和密碼,這是非常危險(xiǎn)的

            posted @ 2008-04-18 15:10 隨意門 閱讀(1520) | 評(píng)論 (0)編輯 收藏
            MySQL:無法遠(yuǎn)程登入MySQL Server解決(摘合)

            MySQL:無法遠(yuǎn)程登入MySQL Server

            嘗試用MySQL Adminstrator GUI Tool登入MySQL Server,Server卻回復(fù)錯(cuò)誤訊息:Host '60-248-32-13.HINET-IP.hinet.net' is not allowed to connect to this
            MySQL server

            這個(gè)是因?yàn)闄?quán)限的問題,處理方式如下:
            shell>mysql --user=root -p
            輸入密碼
            mysql>use mysql
            mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON [db_name].* TO [username]@[ipadd] identified by '[password]';

            [username]:遠(yuǎn)程登入的使用者代碼
            [db_name]:表示欲開放給使用者的數(shù)據(jù)庫稱
            [password]:遠(yuǎn)程登入的使用者密碼
            [ipadd]:IP地址或者IP反查后的DNS Name,此例的內(nèi)容需填入'60-248-32-13.HINET-IP.hinet.net' ,包函上引號(hào)(')

            (其實(shí)就是在遠(yuǎn)端服務(wù)器上執(zhí)行,地址填寫本地主機(jī)的ip地址。)

            如果希望開放所有權(quán)限的話請(qǐng)執(zhí)行:
            mysql>update user set select_priv='Y' , Insert_priv='Y', Update_priv='Y', delete_priv='Y', Create_priv='Y', Drop_priv='Y',Reload_priv='Y', shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', references_priv='Y',Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y',Create_tmp_table_priv='Y',Lock_tables_priv='Y', Execute_priv='Y',Repl_slave_priv='Y',Repl_client_priv='Y' where user='[username]';

             

             

            如何解決客戶端與服務(wù)器端的連接(mysql) :xxx.xxx.xxx.xxx is not allowed to connect to this mysql serv

            這兩天搞MySQL,遇到一些問題,怕忘掉,放上來,留著備用

            這個(gè)方法是在google上搜出來的,不過他是轉(zhuǎn)自CSDN,^_^

            1、進(jìn)入mysql,創(chuàng)建一個(gè)新用戶xuys:
             格式:grant 權(quán)限 on 數(shù)據(jù)庫名.表名 用戶@登錄主機(jī) identified by "用戶密碼";
             grant select,update,insert,delete on *.* to xuys@192.168.88.234 identified by "xuys1234";
               查看結(jié)果,執(zhí)行:
               use mysql;
               select host,user,password from user;
               可以看到在user表中已有剛才創(chuàng)建的xuys用戶。host字段表示登錄的主機(jī),其值可以用IP,也可用主機(jī)名,
               將host字段的值改為%就表示在任何客戶端機(jī)器上能以xuys用戶登錄到mysql服務(wù)器,建議在開發(fā)時(shí)設(shè)為%。
               update user set host = '%' where user = 'xuys';
            2、 ./mysqladmin -uroot -p21century reload
             ./mysqladmin -uroot -p21century shutdown
            3、./mysqld_safe --user-root &
            記?。簩?duì)授權(quán)表的任何修改都需要重新reload,即執(zhí)行第3步。

            如果經(jīng)過以上3個(gè)步驟還是無法從客戶端連接,請(qǐng)執(zhí)行以下操作,在mysql數(shù)據(jù)庫的db表中插入一條記錄:
            use mysql;
            insert into db values('192.168.88.234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
            update db set host = '%' where user = 'xuys';
            重復(fù)執(zhí)行上面的第2、3步。

            posted @ 2008-04-17 14:01 隨意門 閱讀(178) | 評(píng)論 (0)編輯 收藏
            cvs服務(wù)器與wincvs的配置

            大概是兩年前,我從我一個(gè)考研的朋友那里聽到關(guān)于cvs和版本控制這兩個(gè)詞,當(dāng)時(shí)他還教了我怎樣在windows平臺(tái)下配置wincvs和cvsnt。可 惜我當(dāng)時(shí)并不在意這個(gè),弄得現(xiàn)在配置這個(gè)東西花了我兩天的時(shí)間,值得安慰的是在參考了眾多網(wǎng)友的經(jīng)驗(yàn)之后總算配置成功。為此把我的經(jīng)驗(yàn)和教訓(xùn)貼出來以表示 對(duì)網(wǎng)友們的謝意(很抱歉的是當(dāng)時(shí)只顧著看怎么配置沒有記下各位網(wǎng)友的名字,ps自己一下)和對(duì)自己的鼓勵(lì)。以后會(huì)把如何在開發(fā)過程中的使用貼出來。本文主 要參考資料是:吳炎溪  Email:Yanxi-Wu@21cn.com的《cvs服務(wù)器與wincvs的配置與使用》,發(fā)在chinaunix上。

                我配置時(shí)服務(wù)器是redhat linux 9,客戶端是windows xp和wincvs。這里假定讀者已經(jīng)安裝好了redhat linux 9和wincvs,如果不知道怎么安裝可以到網(wǎng)上搜一下。redhat linux 9的安裝我使用的完全安裝,就是把光盤里帶的所有東西都安裝上了。這樣的話所有的服務(wù)器和服務(wù)應(yīng)該都有了,為了偷懶我還把linux上的防火墻給關(guān)掉了, 我是內(nèi)部局域網(wǎng)使用,如果不是的話千萬不要把防火墻關(guān)了。(再ps自己一下)

            一、linux下的cvs服務(wù)器配置

            1、查看/etc/services文件:

                首先要看看/etc/services這個(gè)文件,以確認(rèn)cvs服務(wù)和端口已經(jīng)打開

            cvspserver 2401/tcp # cvs client/server operations 

            cvspserver 2401/udp # cvs client/server operations

            2、配置xinetd,用xinetd來啟動(dòng)cvs服務(wù)器:

                進(jìn)入到/etc/xinetd.d/目錄,在此目錄下編輯一個(gè)名字為cvspserver的文本文件,使用cvspserver作為文件名是因?yàn)樵?etc/services中的入口名字是cvspserver。編輯如下:

            service cvspserver

            {

            disable = no

            protocol = tcp

            socket_type = stream

            port = 2401

            wait = no

            user = root

            env = HOME=

            server = /usr/bin/cvs

            server_args = -f --allow-root=/home/cvsroot pserver

            }

            注意:aservice后面的名稱一定要和你在/etc/service文件中的cvs服務(wù)名稱一樣;b、env = HOME=這一行的目的就是為了解決在執(zhí)行一些cvs操作時(shí)產(chǎn)生的讀取/root/.cvsignore文件的錯(cuò)誤,上面env那行的意思就是在運(yùn)行cvs服務(wù)的時(shí)候?qū)h(huán)境變量HOME置空,這樣雖然執(zhí)行cvs的用戶是root,但是由于沒有了HOME這個(gè)環(huán)境變量,所以cvs就不會(huì)在去讀取/root/.cvsignore文件了。

            3、配置cvs用戶組和cvsroot用戶

                首先建立一個(gè)用戶組cvs,記下cvs組ID。然后添加一個(gè)用戶cvsroot,然后修改/etc/passwd文件,把cvsroot用戶的組ID改為 剛才新建的cvs組的組ID。這樣在/home目錄下就會(huì)有一個(gè)/cvsroot目錄。修改/home/cvsroot的權(quán)限:#chomd 771 /home/cvsroot

            4、對(duì)cvs進(jìn)行初始化:

                要使用cvs服務(wù)器首先要初始化cvs服務(wù)器的根目錄,這樣以后創(chuàng)建的cvs項(xiàng)目都將建立在這個(gè)目錄下:# cvs -d /home/cvsroot init

            5、登錄cvs服務(wù)器(在linux下登錄):

            #cvs -d :pserver:cvsroot@host:/home/cvsroot login

            CVS password//輸入用戶cvsroot的口令;

            如果沒有出現(xiàn)其它的任何提示就表示登錄成功了,否則要根據(jù)提示進(jìn)行相應(yīng)的修改。 下面對(duì)登錄命令的語法進(jìn)行說明:

            其中,:pserver表示采用pserver方式進(jìn)行用戶登錄認(rèn)證,一般的CVS服務(wù)器都采用這

            種方式,當(dāng)然也可以采用其它方式,具體參考相應(yīng)的資料;

                 :cvsroot表示要登錄的用戶名,只要是cvs組的成員都可以,如:cather;

                 @host表示要登錄的服務(wù)器,可以是DNS名,也可以是IP地址,如:10.104.1.204;

            :/home/cvsroot表示CVS在服務(wù)器上的目錄,也可以是其它目錄(由第6中你所

            指定的用來做init初始化的目錄決定);

            提示:也可以把export CVSROOT=":pserver:jchuang"@192.168.0.8:/home/cvsroot這一句直

            接寫在用戶的初始化文件中(如:.bash_profile),這樣用戶每次登錄時(shí),只需輸入:

            cvs login

                然后輸入相應(yīng)的口令就可以登錄到cvs服務(wù)器上。

            b、如果是本地登錄,可以直接把export CVSROOT="/home/cvsroot"這一句寫在用戶的初

            始化文件如:.bash_profile中;然后直接輸入#cvs login,再輸入相應(yīng)的口令就可以登錄到cvs服務(wù)器上了。

            二、WinCVS的配置

            1、WinCVS簡(jiǎn)介:

                WinCVSCVS的一個(gè)客戶端軟件,它運(yùn)行在Windows上,用來在Windows上登錄CVS服務(wù)器,然后進(jìn)行一些CVS相關(guān)的操作與管理。由于當(dāng)前很多的企業(yè)內(nèi)部都采用Linux/Unix做服務(wù)器,而用Windows做客戶端,所以,WinCVSCVS服務(wù)器配合使用將組成最強(qiáng)有力的版本控制與管理的系統(tǒng)之一。

            2WinCVS的下載與安裝;

               最新的WinCVS可以從http://sourceforge.net/project/showfiles.php?group_id=10072地址下載到,也可以在http://sourceforge.net/project 上下載到最新的或其它版本的WinCVS。下載到相應(yīng)的版本后根據(jù)向?qū)нM(jìn)行安裝,已經(jīng)要使用CVS的用戶,安裝這個(gè)WinCVS應(yīng)該沒什么問題吧!

            3、配置WinCVS

            a、一般選項(xiàng)的設(shè)置,選擇Admin->references…,出現(xiàn)如下界面:

               

            第一、Authentication:用來配置cvs服務(wù)器的認(rèn)證方式,可以從下拉框中選擇其它的認(rèn)證方式,不過一般只要選擇默認(rèn)的pserver方式就可以,要注意的是必須與cvs服務(wù)器配置時(shí)所指定的認(rèn)證方式一致;

            第二、Path:用來配置cvs在服務(wù)器上的主目錄路徑,也就是服務(wù)器上用進(jìn)行cvs初始化的目錄,如:/home/cvsroot;

            第三、Host Address:用來配置cvs服務(wù)器所在服務(wù)器的地址,可以是IP地址,也可以是DNS名,如:10.104.1.204;

            第四、User name:用來配置要使用些WinCVS來登錄CVS服務(wù)器的用戶名,如:cvsyxwu,用戶的登錄必須由管理員把其添加cvs用戶組中;

            第五、CVSROOT:此項(xiàng)一般都不需要用戶進(jìn)行修改,用戶在輸入上邊的幾個(gè)選項(xiàng)時(shí),系統(tǒng)將自動(dòng)根據(jù)用戶的輸入生成此項(xiàng)的相應(yīng)內(nèi)容。

            b、全局選項(xiàng)的設(shè)置,在上一個(gè)界面上選擇“Globals”:

               

               此項(xiàng)的配置主要是要注意這幾選項(xiàng):

            第一,Checkout read-only不要選上,否則,checkout出來的源代碼將不允許用戶進(jìn)行

            修改,并且此選項(xiàng)默認(rèn)是選中的;

            第二,Prune (remove) empty directories也不要選上,否則,會(huì)自動(dòng)刪除空目錄;

            第三,對(duì)一般配置沒有特殊要求的,把Dirty files support、Supply control when adding

            TCP/IP compression選項(xiàng)選中;

            4、登錄服務(wù)器:

            選擇Admin->;login,將出現(xiàn)如下對(duì)話框要求用戶輸入登錄口令

             

            輸入口令后,選擇“OK”按鈕,如果CVS服務(wù)器與WinCVS的配置都沒出錯(cuò)的話,將在CVS的狀態(tài)欄中提示:

            cvs -z9 -d :pserver:cvsyxwu@10.104.1.204:/home/cvsroot login

            Logging in to :pserver:cvsyxwu@10.104.1.204:2401/home/cvsroot

            ***** CVS exited normally with code 0 *****

            code 0表示正確的登錄;而如果出錯(cuò)的話,將是code 1,那么要根據(jù)錯(cuò)誤的提示進(jìn)行相應(yīng)的修改。

            posted @ 2008-04-16 15:21 隨意門 閱讀(554) | 評(píng)論 (0)編輯 收藏
            系統(tǒng)自帶的最不起眼但又最強(qiáng)的殺毒工具

             Windows系統(tǒng)集成了無數(shù)的工具,它們各司其職,滿足用戶不同的應(yīng)用需求。其實(shí)這些工具“多才多藝”,如果你有足夠的想象力并且善于挖掘,你會(huì)發(fā)現(xiàn)它們除了本行之外還可以幫我們殺毒。不信?你看吧!

              一、任務(wù)管理器給病毒背后一刀

              

              Windows任務(wù)管理器是大家對(duì)進(jìn)程進(jìn)行管理的主要工具,在它的“進(jìn)程”選項(xiàng)卡中能查看當(dāng)前系統(tǒng)進(jìn)程信息。在默認(rèn)設(shè)置下,一般只能看到映像名稱、用戶名、CPU占用、內(nèi)存使用等幾項(xiàng),而更多如I/O讀寫、虛擬內(nèi)存大小等信息卻被隱藏了起來??蓜e小看了這些被隱藏的信息,當(dāng)系統(tǒng)出現(xiàn)莫名其妙的故障時(shí),沒準(zhǔn)就能從它們中間找出突破口。

              1.查殺會(huì)自動(dòng)消失的雙進(jìn)程木馬

              前段時(shí)間朋友的電腦中了某木馬,通過任務(wù)管理器查出該木馬進(jìn)程為“system.exe”,終止它后再刷新,它又會(huì)復(fù)活。進(jìn)入安全模式把c:\windows\system32\system.exe刪除,重啟后它又會(huì)重新加載,怎么也無法徹底清除它。從此現(xiàn)象來看,朋友中的應(yīng)該是雙進(jìn)程木馬。這種木馬有監(jiān)護(hù)進(jìn)程,會(huì)定時(shí)進(jìn)行掃描,一旦發(fā)現(xiàn)被監(jiān)護(hù)的進(jìn)程遭到查殺就會(huì)復(fù)活它。而且現(xiàn)在很多雙進(jìn)程木馬互為監(jiān)視,互相復(fù)活。因此查殺的關(guān)鍵是找到這“互相依靠”的兩個(gè)木馬文件。借助任務(wù)管理器的PID標(biāo)識(shí)可以找到木馬進(jìn)程。

              調(diào)出Windows任務(wù)管理器,首先在“查看→選擇列”中勾選“PID(進(jìn)程標(biāo)識(shí)符)”,這樣返回任務(wù)管理器窗口后可以看到每一個(gè)進(jìn)程的PID標(biāo)識(shí)。這樣當(dāng)我們終止一個(gè)進(jìn)程,它再生后通過PID標(biāo)識(shí)就可以找到再生它的父進(jìn)程。啟動(dòng)命令提示符窗口,執(zhí)行“taskkill /im system.exe /f”命令。刷新一下電腦后重新輸入上述命令如圖1,可以看到這次終止的system.exe進(jìn)程的PID為1536,它屬于PID為676的某個(gè)進(jìn)程。也就是說PID為1536的system.exe進(jìn)程是由PID為676的進(jìn)程創(chuàng)建的。返回任務(wù)管理器,通過查詢進(jìn)程PID得知它就是“internet.exe”進(jìn)程進(jìn)程。(如圖)


              找到了元兇就好辦了,現(xiàn)在重新啟動(dòng)系統(tǒng)進(jìn)入安全模式,使用搜索功能找到木馬文件c:\windows\internet.exe ,然后將它們刪除即可。前面無法刪除system.exe,主要是由于沒有找到internet.exe(且沒有刪除其啟動(dòng)鍵值),導(dǎo)致重新進(jìn)入系統(tǒng)后internet.exe復(fù)活木馬。

              2.揪出狂寫硬盤的P2P程序

              單位一電腦一開機(jī)上網(wǎng)就發(fā)現(xiàn)硬盤燈一直閃個(gè)不停,硬盤狂旋轉(zhuǎn)。顯然是本機(jī)有什么程序正在進(jìn)行數(shù)據(jù)的讀取,但是反復(fù)殺毒也沒發(fā)現(xiàn)病毒、木馬等惡意程序。

              打開該電腦并上網(wǎng),按Ctrl+Alt+Del鍵啟動(dòng)了任務(wù)管理器,切換到“進(jìn)程”選項(xiàng)卡,點(diǎn)擊菜單命令“查看→選擇列”,同時(shí)勾選上“I/O寫入”和“I/O寫入字節(jié)”兩項(xiàng)。確定后返回任務(wù)管理器,發(fā)現(xiàn)一個(gè)陌生的進(jìn)程hidel.exe,雖然它占用的CPU和內(nèi)存并不是特別大,但是I/O的寫入量卻大得驚人,看來就是它在搗鬼了,趕緊右擊它并選擇“結(jié)束進(jìn)程”終止,果然硬盤讀寫恢復(fù)正常了。

              二、系統(tǒng)備份工具殺毒于無形

              筆者曾遭遇一個(gè)無法刪除的病毒“C:\Program Files\Common Files\PCSuite\rasdf.exe”,同時(shí)也無法復(fù)制這個(gè)文件,如何清除它。筆者通過系統(tǒng)備份工具清除了該病毒,操作過程如下:

              第一步:?jiǎn)螕?#8220;開始→所有程序→附件→系統(tǒng)工具→備份”,打開備份或還原向?qū)Т翱冢瑐浞蓓?xiàng)目選擇“讓我選擇要備份的內(nèi)容”,定位到“C:\Program Files\Common Files\PCSuite”。

              第二步:繼續(xù)執(zhí)行備份向?qū)Р僮?,將備份文件保存?#8220;g:\virus.bkf”,備份選項(xiàng)勾選“使用卷陰影復(fù)制”,剩余操作按默認(rèn)設(shè)置完成備份。

              第三步:雙擊“g:\virus.bak”,打開備份或還原向?qū)В褌浞葸€原到“g:\virus”。接著打開“g:\virus”,使用記事本打開病毒文件“rasdf.exe”,然后隨便刪除其中幾行代碼并保存,這樣病毒就被我們使用記事本破壞了(它再也無法運(yùn)行)。

              第四步:操作同上,重新制作“k:\virus”的備份為“k:\virus1.bkf”。然后啟動(dòng)還原向?qū)?,還原位置選擇“C:\Program Files\Common Files\PCSuite\”,還原選項(xiàng)選擇“替換現(xiàn)有文件”。這樣,雖然當(dāng)前病毒正在運(yùn)行,但備份組件仍然可以使用壞的病毒文件替換當(dāng)前病毒。還原完成后,系統(tǒng)提示重新啟動(dòng),重啟后病毒就不會(huì)啟動(dòng)了(因?yàn)樗驯挥浭卤酒茐?。

              三、記事本借刀殺人

              1.雙進(jìn)程木馬的查殺

              現(xiàn)在,越來越多的木馬采用雙進(jìn)程守護(hù)技術(shù)保護(hù)自己,就是兩個(gè)擁有同樣功能的代碼程序,不斷地檢測(cè)對(duì)方是否已經(jīng)被別人終止,如果發(fā)現(xiàn)對(duì)方已經(jīng)被終止了,那么又開始創(chuàng)建對(duì)方,這給我們的查殺帶來很大的困難。不過,此類木馬也有“軟肋”,它只通過進(jìn)程列表進(jìn)程名稱來判斷被守護(hù)進(jìn)程是否存在。這樣,我們只要用記事本程序來替代木馬進(jìn)程,就可以達(dá)到“欺騙”守護(hù)進(jìn)程的目的。

              下面以某變種木馬的查殺為例。中招該木馬后,木馬的“internet.exe”和“systemtray.exe”兩個(gè)進(jìn)程會(huì)互相監(jiān)視。當(dāng)然,我們中招的時(shí)候大多不知道木馬具體的監(jiān)護(hù)進(jìn)程。不過,通過進(jìn)程名稱可以知道,“systemtray.exe”是異常的進(jìn)程,因?yàn)橄到y(tǒng)正常進(jìn)程中沒有該進(jìn)程。下面使用替換方法來查殺該木馬。

              第一步:?jiǎn)螕?#8220;開始→運(yùn)行”,輸入“Msinfo32”打開系統(tǒng)信息窗口,展開“系統(tǒng)摘要→軟件環(huán)境→正在運(yùn)行任務(wù)”,這里可以看到“systemtray.exe”路徑在“C:\Windows\System32”下。

              第二步:打開“C:\Windows\System32”,復(fù)制記事本程序“notepad.exe”到“D:\” ,同時(shí)重命名為“systemtray.exe”。

              第三步:打開記事本程序,輸入下列代碼,保存為“shadu.bat”,放置在桌面(括號(hào)為注釋,無須輸入):

              @echo off

              Taskkill /f /im systemtray.exe (使用taskkill命令強(qiáng)行終止“systemtray.exe”進(jìn)程)

              Delete C:\Windows\System32\systemtray.exe (刪除病毒文件)

              Copy d:\systemtray.exe C:\Windows\System32\(替換病毒文件)

              第四步:現(xiàn)在只要在桌面運(yùn)行“shadu.bat”,系統(tǒng)會(huì)將“systemtray.exe”進(jìn)程終止并刪除,同時(shí)把改名的記事本程序復(fù)制到系統(tǒng)目錄。這樣,守護(hù)進(jìn)程會(huì)“誤以為”被守護(hù)進(jìn)程還存在,它會(huì)立刻啟動(dòng)一個(gè)記事本程序。

              第五步:接下來我們只要找出監(jiān)視進(jìn)程并刪除即可,在命令提示符輸入:

              “taskkill /f /im systemtray.exe ”,將守護(hù)進(jìn)程再生的“systemtray.exe”終止,可以看到“systemtray.exe”進(jìn)程是由“PID 3288的進(jìn)程”創(chuàng)建的,打開任務(wù)管理器可以看到“PID 3288的進(jìn)程”為“internet.exe”,這就是再生進(jìn)程的“元兇”。

              第六步:按照第一步方式,打開系統(tǒng)信息窗口可以看到“internet.exe”也位于系統(tǒng)目錄,終止“internet.exe”進(jìn)程并進(jìn)入系統(tǒng)目錄把上述兩個(gè)文件刪除即可。

              2.使病毒失效并刪除

              大家知道,文件都是由編碼組成的,記事本程序理論上可以打開任意文件(只不過有些會(huì)顯示為亂碼)。我們可以將病毒打開方式關(guān)聯(lián)到記事本,使之啟動(dòng)后變成由記事本打開,失去作惡的功能。比如,一些頑固病毒常常會(huì)在注冊(cè)表的“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”等啟動(dòng)位置生成難以刪除的鍵值,達(dá)到惡意啟動(dòng)的目的。下面使用記事本來“廢”掉病毒的生命力。

              第一步:?jiǎn)?dòng)命令提示符,輸入“ftype exefile=notepad.exe %1”,把所有EXE程序打開方式關(guān)聯(lián)到記事本程序,重啟系統(tǒng)后我們會(huì)發(fā)現(xiàn)桌面自動(dòng)啟動(dòng)好幾個(gè)程序,這里包括系統(tǒng)正常的程序如輸入法、音量調(diào)整程序等,當(dāng)然也包括惡意啟動(dòng)的流氓程序,不過現(xiàn)在都被記事本打開了。

              第二步:根據(jù)記事本窗口標(biāo)題找到病毒程序,比如上例的systemtray.exe程序,找到這個(gè)記事本窗口后,單擊“文件→另存為”,我們就可以看到病毒具體路徑在“C:\Windows\System32”下。現(xiàn)在關(guān)掉記事本窗口,按上述路徑提示進(jìn)入系統(tǒng)目錄刪除病毒即可。

              第三步:刪除病毒后就可以刪除病毒啟動(dòng)鍵值了,接著重啟電腦,按住F8,然后在安全模式菜單選擇“帶命令提示的安全模式”,進(jìn)入系統(tǒng)后會(huì)自動(dòng)打開命令提示符。輸入“ftype exefile="%1"%*”恢復(fù)exe文件打開方式即可。

              四、注冊(cè)表映像劫持讓病毒沒脾氣

              現(xiàn)在病毒都會(huì)采用IFO的技術(shù),通俗的講法是映像劫持,利用的是注冊(cè)表中的如下鍵值

              HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options位置來改變程序調(diào)用的,而病毒卻利用此處將正常的殺毒軟件給偷換成病毒程序。恰恰相反,讓我們自己可以利用此處欺瞞病毒木馬,讓它實(shí)效。可謂,瞞天過海,還治其人。

              下面我們以屏蔽某未知病毒KAVSVC.EXE為例,操作方法如下:

              第一步:先建立以下一文本文件,輸入以下內(nèi)容,另存為1.reg

              Windows Registry Editor Version 5.00

              [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\KAVSVC.EXE]

              "Debugger"="d:\\1.exe"

              [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\KAVSVC.EXE]

              "Debugger"="d:\\1.exe"

              (注:第一行代碼下有空行。)

              第二步:雙擊導(dǎo)入該reg文件后,確定。

              第三步:點(diǎn)“開始→運(yùn)行”后,輸入KAVSVC.EXE。

              提示:1.exe可以是任意無用的文件,是我們隨意創(chuàng)建一個(gè)文本文件后將后綴名.txt改為.exe的,

              總結(jié):當(dāng)我們飽受病毒木馬的折磨,在殺毒軟件無能為力或者感覺“殺雞焉用宰牛刀”時(shí),不妨運(yùn)用系統(tǒng)工具進(jìn)行病毒木馬的查殺,說不定會(huì)起到意想不到的效果

            posted @ 2008-04-10 09:39 隨意門 閱讀(221) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共9頁: 1 2 3 4 5 6 7 8 9 
            99热成人精品免费久久| 久久中文字幕人妻熟av女| 99久久国产亚洲高清观看2024| 久久五月精品中文字幕| 久久精品国产亚洲精品2020| 久久国产精品一区| 东京热TOKYO综合久久精品| 亚洲欧美日韩精品久久亚洲区 | 99久久免费国产特黄| 亚洲国产成人久久一区WWW| 亚洲乱亚洲乱淫久久| 久久精品亚洲日本波多野结衣 | 久久精品国产亚洲AV蜜臀色欲| 国产A级毛片久久久精品毛片| 亚洲中文字幕无码久久2017| 久久不见久久见免费影院www日本| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲国产成人久久精品99| 精品乱码久久久久久夜夜嗨| 99久久99这里只有免费的精品| 亚洲乱码中文字幕久久孕妇黑人| 久久九九久精品国产| 9191精品国产免费久久| 狠狠干狠狠久久| 久久精品无码专区免费东京热| 国产69精品久久久久久人妻精品 | 欧美久久亚洲精品| 精品熟女少妇aⅴ免费久久| 日韩欧美亚洲综合久久影院d3| 久久大香香蕉国产| 欧美噜噜久久久XXX| 婷婷久久久亚洲欧洲日产国码AV| 久久精品极品盛宴观看| 亚洲午夜精品久久久久久浪潮| 久久国产视频99电影| 国产精品久久久99| 久久国产福利免费| 久久精品成人影院| 色综合久久久久综合99| 97香蕉久久夜色精品国产| 伊人色综合久久天天网|