简易HTTP服务器(epoll模型ET版本)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 



#define SERVER_NAME "IAMCAP-SERVER"
#define PROTOCOL    "HTTP/1.1"
#define REQUESTLEN 4096
#define RESPONSELEN  1024000

#define LISTENNUM 5
#define TIMELEN 55
#define TEMPLEN 100
#define BUFFERLEN 1024

#define MAX_EVENT_NUMBER 1024


#define HOMEPATH  "/Users/iamcap/http/showhttp/"

#define _XUCC_EPOLL_LT

char* add_header(int status, char *title, char *mime_type, off_t length, char *buffer , int buffersize);
char* get_mime_type(char *filename);
void parsedata(char *recvdata, int connectfd);
int setnonblocking(int fd);
void maddfd(int epollfd, int fd, int enable_et);
void lt(struct epoll_event *events,int number, int epollfd, int listenfd);
void et(struct epoll_event *events, int number, int epollfd, int listenfd);



int main(int argc, char **argv){
    if(argc <=2){
        printf("usage: %s ip_address port_number\n", (argv[0]));
        return 1;
    }
    const char *ip = argv[1];
    int port = atoi(argv[2]);
    
    //initialize the struct
    
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);
    
    struct epoll_event ev, events[MAX_EVENT_NUMBER];
    int epollfd = epoll_create(50);   //创建内核事件表,50现在已经失去作用
    assert(epollfd != -1);
    
    //reuse the port
    
    int sock = socket(PF_INET, SOCK_STREAM, 0);
    assert( sock >= 0);
    
    //int opt = 1;
    //setsockopt(sock, SOL_SOCKET,SO_REUSEADDR, &opt, sizeof(opt));
    maddfd(epollfd,sock,1);           //将sock的套接字注册到内核事件表中,以EPOLLLIN的方式
 
     
    int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));
    assert(ret != -1);
    
    printf("listening ...\n");
    ret = listen(sock, LISTENNUM);
    assert(ret != -1);
    
    //change dir
    if(chdir(HOMEPATH)<0){
        printf("chdir error\n");
        exit(0);
    }

    
    
    while(1){
        
        printf("wait...\n");
	    int ret = epoll_wait(epollfd, events, MAX_EVENT_NUMBER, -1);
        
    	if (ret < 0) {
            continue;
        }else if(ret > 0){
            int i = 0;
        	for(; i");
                
                char head[BUFFERLEN];
                memset(head,'\0',BUFFERLEN);
                add_header(200, "OK", "text/html", strlen(mes), head, BUFFERLEN);
                char temp[RESPONSELEN];
                memset(temp,'\0',RESPONSELEN);
                strcpy(temp,head);
                strcat(temp,mes);
                send(connectfd, temp, strlen(head)+strlen(mes),0);
                
                close(connectfd);
            }
        }else{        //not home dir return 
            exit(0);
        }
    }else{                               //if is a file
        if(0 == strcasecmp(method,"GET")){
            FILE *fp;
            if(fp = fopen(path+1,"rb")){
                char head[BUFFERLEN];
                memset(head,'\0',BUFFERLEN);
                stat(path+1,&property);
                add_header(200, "OK", get_mime_type((path + 1)), property.st_size, head, BUFFERLEN);
                char temp[RESPONSELEN];
                memset(temp,'\0',RESPONSELEN);
                strcpy(temp,head);
                fread(temp+strlen(head),1,property.st_size,fp);
                send(connectfd, temp, strlen(head)+property.st_size,0);
                close(connectfd);
            }
        }else if(0 == strcasecmp(method,"POST")){
            
        }else if(0 == strcasecmp(method,"HEAD")){
            
        }else if(0 == strcasecmp(method,"PUT")){
            
        }else{
            exit(0);
        }
    }
}

int setnonblocking(int fd){
    
    int old_option = fcntl(fd, F_GETFL);
    int new_option = old_option | O_NONBLOCK;
    fcntl(fd, F_SETFL, new_option);
    return old_option;
}


void maddfd(int epollfd, int fd, int enable_et){
    
    struct epoll_event event;
    event.data.fd = fd;
    event.events = EPOLLIN;
    if (enable_et) {
        event.events |= EPOLLET;
    }
    epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event);
    setnonblocking(fd);
}

void lt(struct epoll_event *events,int number, int epollfd, int listenfd){
    int i = 0;
    for(; i
index.html

index.html

  
      
        

this is a page



你可能感兴趣的:(口袋购物)