#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