免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhoulifa
打印 上一主题 下一主题

Linux网络编程一步一步学-自己编写一个HTTP协议的目录浏览和文件下载服务器 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-12-04 17:25 |只看该作者

回复 #1 zhoulifa 的帖子

你的qq.能加你向你学习学习么????

论坛徽章:
0
32 [报告]
发表于 2009-03-08 19:13 |只看该作者

回复 #1 zhoulifa 的帖子

周老师:
       您好!
       我想请问为什么我的浏览器显示连接不到服务器呢?我已经编译并运行了这个程序在GCC下面。

论坛徽章:
0
33 [报告]
发表于 2009-03-09 20:37 |只看该作者
真是好人啊,先好好看看你的代码,看能不能明白编程是怎么个步骤,正好看了书不知道怎么走了

论坛徽章:
0
34 [报告]
发表于 2009-03-12 22:09 |只看该作者
嗯 ,好东西,顶一个。楼主强人。

论坛徽章:
0
35 [报告]
发表于 2009-03-12 22:16 |只看该作者
不错!!!

论坛徽章:
0
36 [报告]
发表于 2009-03-13 10:15 |只看该作者
好东西啊,学习ing

论坛徽章:
0
37 [报告]
发表于 2009-03-16 15:54 |只看该作者
调试了一下,lz还应该多一些debug信息,网页里面跟在地址后面的目录应该是/home下的目录,否则会提示“请像管理员咨询为何出现如下错误提示...No such file or directory”。我耗了点时间在debug这个问题上,郁闷。

ps:lz的code架构清晰明了,看起来很舒服。

论坛徽章:
0
38 [报告]
发表于 2009-03-16 21:05 |只看该作者
请问为什么我运行这代码的时候,显示的是乱码?请高手指教

论坛徽章:
0
39 [报告]
发表于 2009-04-20 09:34 |只看该作者
非常好的代码,但是有个小问题会导致僵尸进程,将main函数修改一下就不会了
int main(int argc, char **argv)
{
    struct sockaddr_in addr;
    int sock_fd, addrlen;

    /* 禄帽脤貌梅脦媒IP 隆垄露丝凇垄录脿脢隆垄脥页赂霉隆垄目录麓忙位脰碌脠*/
    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, port, back, dirroot, logdir, daemon_y_n?"":"NO", 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;
        int pid;
        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, "Peer: %s:%d\n",
                inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
        if (!daemon_y_n) {
            prtinfomsg(buffer);
        } else {
            wrtinfomsg(buffer);
        }
        /* 虏煤赂枚酶麓娄脌脟脟拢卢碌卤前陆酶脨碌却媒卢陆拥陆4 */
        if((pid=fork())<0){
            printf("fork error");
        } else if(pid==0){
            /* first child*/
            if((pid = fork())<0)
                printf("fork error");
            else if(pid >0)
                exit(0);
            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, "Request File: \"%s\"\n", Req);
                    if (!daemon_y_n) {
                        prtinfomsg(buffer);
                    } else {
                        wrtinfomsg(buffer);
                    }
                    /* 麓娄脌脫禄搂脟脟 */
                    GiveResponse(ClientFP, Req);
                    fclose(ClientFP);
                }
            }
            exit(0);
        }
        if(waitpid(pid,NULL,0)!=pid)
          printf("waitpid error");
        close(new_fd);
    }
    close(sock_fd);
    return 0;
}

论坛徽章:
0
40 [报告]
发表于 2012-04-05 19:27 |只看该作者
标记,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP