码迷,mamicode.com
首页 > Web开发 > 详细

c-webserver.c

时间:2015-10-26 01:49:25      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

main(int ac,char * av[])
{
    int sock,fd;
    FILE  * fpin;
    char request[BUFSIZ];
    if(ac == 1){
        fprintf(stderr,"usage:ws portnum\n");
        exit(1);
    }

    sock = make_server_socket(atoi(av[1]));
    if(sock == -1)
        exit(2);

    /* main loop here */
    while(1){
        /* take a call and buffer it */
        fd = accept(sock,NULL,NULL);
        fpin = fdopen(fd,"r");

        /* read request */
        fgets(request,BUFSIZ,fpin);
        printf("got a call:request = %s ",request);
        read_til_crnl(fpin);

        /* do what client asks */
        process_rq(request,fd);

        fclose(fpin);
    }
}

/*------------read_til_crnl(FILE *)----------------------------------------
*-------------skip over all request info until a CRNL is seen-----------*/

read_til_crnl(FILE * fp)
{
    char buf[BUFSIZ];
    while( fgets(buf,BUFSIZ,fp) != NULL && strcmp(buf,"\r\n") != 0);
}

/*-----------process_rq(char * rq,int fd)
-------------do waht the request asks for and write reply to fd
-------------handles request in a new process
-------------rq is HTTP command: GET /foo/bar.html HTTP/1.0
*/

process_rq(char * rq,int fd)
{
    char cmd[BUFSIZ],arg[BUFSIZ];

    /* create a new process and return if not the child */
    if(fork() != 0)
        return;

    strcpy(arg,"./");    /* precede args with. */
    if(sscanf(rq,"%s %s",cmd,arg+2) != 2)        /*  */
        return;
}

/*---------the reply header thing: allfunctions need one
----------- if content_type is NULL then don‘t send content type
*/

header(FILE * fp,char * content_type)
{
    fprintf(fp,"HTTP/1.0 200 OK\r\n");
    if(content_type)
        fprintf(fp,"Content_type:%s\r\n",content_type);
}

/*---------Simple function first:
-------------cannot_do(fd)        unimplemented HTTP command
------------and do_404(item,fd)    no such object
*/

cannot_do(int fd)
{
    FILE * fp = fdopen(fd,"w");
    fprintf(fp,"HTTP/1.0 501 Not Implemented\r\n");
    fprintf(fp,"Content_type:text/plain\r\n");
    fprintf(fp,"\r\n");

    fprintf(fp,"That command is not yet Implemented");
    fclose(fp);
}

do_404(char * item,int fd)
{
    FILE * fp = fdopen(fd,"w");
    fprintf(fp,"HTTP/1.0 404 Not Found\r\n");
    fprintf(fp,"Content_type:text/plain\r\n");
    fprintf(fp,"\r\n");

    fprintf(fp,"The item you requested:%s\r\n is not found \r\n",item);
    fclose(fp);
}

/*-------------the directory listing section
---------------isaddir() uses stat, not_exist() uses stat
---------------do_ls runs ls. It should not
*/

isaddir(char * f)
{
    struct stat info;
    return (stat(f,&info) != -1 && S_ISDIR(info.st_mode));
}

not_exist(char *f)
{
    struct stat info;
    return(stat(f,&info) == -1);
}

do_ls(char * dir,int fd)
{
    FILE * fp;
    fp = fdopen(fd,"w");
    fprintf(fp,"text/plain\r\n");
    fflush(fp);

    dup2(fd,1);
    dup2(fd,2);
    close(fd);
    execlp("ls","ls","-l",dir,NULL);
    perror(dir);
    exit(1);
}

/*---------the cgi sutff. function to check extension and one to run the program.
*/

char * file_type(char *f)
/* returns ‘extension‘ of file */
{
    char * cp;
    if((cp = strrchr(f,.)) != NULL)
        return cp+1;
    return "";
}

ends_in_cgi(char *f)
{
    return (strcmp(file_type(f),"cgi") == 0);
}

do_exec(char * prog,int fd)
{
    FILE * fp;
    fp = fdopen(fd,"w");
    header(fp,NULL);
    fflush(fp);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);
    execl(prog,prog,NULL);
    perror(prog);
}

/*------------------do_cat(filename,fd)
--------------------send back contents afet a header
*/
do_cat(char *f,int fd)
{
    char * extension = file_type(f);
    char * content = "text/plain";
    FILE * fpsock, * fpfile;
    int c;

    if(strcmp(extension,"html") == 0 )
        content = "text/html";
    else if(strcmp(extension,"gif") == 0)
        content = "text/gif";
    else if(strcmp(extension,"jpg") == 0)
        content = "text/jpeg";
    else if(strcmp(extension,"jpeg") == 0)
        content = "text/jpeg";

    fpsock = fdopen(fd,"w");
    fpfile = fopen(f,"r");
    if(fpsock != NULL && fpfile != NULL)
    {
        header(fpsock,content);
        fprintf(fpsock,"\r\n");
        while((c = getc(fpfile)) != EOF)
            putc(c,fpsock);
        fclose(fpfile);
        fclose(fpsock);
    }
    exit(0);
}

 

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>
main(int ac,char * av[]){int sock,fd;FILE  * fpin;char request[BUFSIZ];if(ac == 1){fprintf(stderr,"usage:ws portnum\n");exit(1);}
sock = make_server_socket(atoi(av[1]));if(sock == -1)exit(2);
/* main loop here */while(1){/* take a call and buffer it */fd = accept(sock,NULL,NULL);fpin = fdopen(fd,"r");
/* read request */fgets(request,BUFSIZ,fpin);printf("got a call:request = %s ",request);read_til_crnl(fpin);
/* do what client asks */process_rq(request,fd);
fclose(fpin);}}
/*------------read_til_crnl(FILE *)----------------------------------------*-------------skip over all request info until a CRNL is seen-----------*/
read_til_crnl(FILE * fp){char buf[BUFSIZ];while( fgets(buf,BUFSIZ,fp) != NULL && strcmp(buf,"\r\n") != 0);}
/*-----------process_rq(char * rq,int fd)-------------do waht the request asks for and write reply to fd-------------handles request in a new process-------------rq is HTTP command: GET /foo/bar.html HTTP/1.0*/
process_rq(char * rq,int fd){char cmd[BUFSIZ],arg[BUFSIZ];
/* create a new process and return if not the child */if(fork() != 0)return;
strcpy(arg,"./");/* precede args with. */if(sscanf(rq,"%s %s",cmd,arg+2) != 2)/*  */return;}
/*---------the reply header thing: allfunctions need one----------- if content_type is NULL then don‘t send content type*/
header(FILE * fp,char * content_type){fprintf(fp,"HTTP/1.0 200 OK\r\n");if(content_type)fprintf(fp,"Content_type:%s\r\n",content_type);}
/*---------Simple function first:-------------cannot_do(fd)unimplemented HTTP command------------and do_404(item,fd)no such object*/
cannot_do(int fd){FILE * fp = fdopen(fd,"w");fprintf(fp,"HTTP/1.0 501 Not Implemented\r\n");fprintf(fp,"Content_type:text/plain\r\n");fprintf(fp,"\r\n");
fprintf(fp,"That command is not yet Implemented");fclose(fp);}
do_404(char * item,int fd){FILE * fp = fdopen(fd,"w");fprintf(fp,"HTTP/1.0 404 Not Found\r\n");fprintf(fp,"Content_type:text/plain\r\n");fprintf(fp,"\r\n");
fprintf(fp,"The item you requested:%s\r\n is not found \r\n",item);fclose(fp);}
/*-------------the directory listing section---------------isaddir() uses stat, not_exist() uses stat---------------do_ls runs ls. It should not*/
isaddir(char * f){struct stat info;return (stat(f,&info) != -1 && S_ISDIR(info.st_mode));}
not_exist(char *f){struct stat info;return(stat(f,&info) == -1);}
do_ls(char * dir,int fd){FILE * fp;fp = fdopen(fd,"w");fprintf(fp,"text/plain\r\n");fflush(fp);
dup2(fd,1);dup2(fd,2);close(fd);execlp("ls","ls","-l",dir,NULL);perror(dir);exit(1);}
/*---------the cgi sutff. function to check extension and one to run the program.*/
char * file_type(char *f)/* returns ‘extension‘ of file */{char * cp;if((cp = strrchr(f,‘.‘)) != NULL)return cp+1;return "";}
ends_in_cgi(char *f){return (strcmp(file_type(f),"cgi") == 0);}
do_exec(char * prog,int fd){FILE * fp;fp = fdopen(fd,"w");header(fp,NULL);fflush(fp);dup2(fd,1);dup2(fd,2);close(fd);execl(prog,prog,NULL);perror(prog);}
/*------------------do_cat(filename,fd)--------------------send back contents afet a header*/do_cat(char *f,int fd){char * extension = file_type(f);char * content = "text/plain";FILE * fpsock, * fpfile;int c;
if(strcmp(extension,"html") == 0 )content = "text/html";else if(strcmp(extension,"gif") == 0)content = "text/gif";else if(strcmp(extension,"jpg") == 0)content = "text/jpeg";else if(strcmp(extension,"jpeg") == 0)content = "text/jpeg";
fpsock = fdopen(fd,"w");fpfile = fopen(f,"r");if(fpsock != NULL && fpfile != NULL){header(fpsock,content);fprintf(fpsock,"\r\n");while((c = getc(fpfile)) != EOF)putc(c,fpsock);fclose(fpfile);fclose(fpsock);}exit(0);}

c-webserver.c

标签:

原文地址:http://www.cnblogs.com/xccnblogs/p/4910141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!