#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/epoll.h>
#include<fcntl.h>
#include<errno.h>
#define BUF_SIZE 100
#define EPOLL_SIZE 50
void error_handling(char *buf);
int flag = 0;
void* content_type(char* file);
void send_error(int epfd);
void send_data(int epfd,char* ct, char* file_name);
int main(int argc,char *argv[])
{
int serv_sock,clnt_sock;
struct sockaddr_in serv_adr,clnt_adr;
socklen_t adr_sz;
int str_len,i;
char buf[1024];
struct epoll_event *ep_events;
struct epoll_event event;
int epfd,event_cnt;
if(argc!=2)
{
printf("Usage :%s <port>\n",argv[0]);
exit(1);
}
serv_sock=socket(PF_INET,SOCK_STREAM,0);
memset(&serv_adr,0,sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)
error_handling("bind() error");
printf("bind sucesss!\n");
if(listen(serv_sock,5)==-1)
error_handling("listen()error");
printf("listen sucess!\n");
epfd=epoll_create(EPOLL_SIZE);
ep_events=malloc(sizeof(struct epoll_event)*EPOLL_SIZE);
printf("set the socket is nonblocking!\n");
//set serv_sock nonblocking
flag=fcntl(serv_sock,F_GETFL,0);
fcntl(serv_sock,F_SETFL,flag|O_NONBLOCK);
event.events=EPOLLIN;
event.data.fd=serv_sock;
epoll_ctl(epfd,EPOLL_CTL_ADD,serv_sock,&event);
printf("Epoll create sucessful!\n");
//给客户发送网页 后续可以根据具体请求,转向不同页面
// char file_name[30]="index.html";
// printf("file name is %s",file_name);
//printf("please your filepath and filename:");
//scanf("%s",&file_name);
//getchar();
while(1)
{
event_cnt=epoll_wait(epfd,ep_events,EPOLL_SIZE,-1);
printf("client is connect sucess!\n");
if(event_cnt==-1)
{
puts("epoll_wait() error");
// break;
continue;
}
printf("create system resource sucess!\n");
for(i=0;i<event_cnt;i++)
{
if(ep_events[i].data.fd==serv_sock)
{
adr_sz=sizeof(clnt_adr);
clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&adr_sz);
printf("clnt_sock's value =%d\n\n",clnt_sock);
event.events=EPOLLIN;
event.data.fd=clnt_sock;
epoll_ctl(epfd,EPOLL_CTL_ADD,clnt_sock,&event);
printf("connected client:%d address is %s\n",inet_ntoa(clnt_adr.sin_addr));
}
else
{
printf("read client'data\n");
str_len=read(ep_events[i].data.fd,buf,sizeof(buf));
if(str_len==0) //close request!
{
epoll_ctl(epfd,EPOLL_CTL_DEL,ep_events[i].data.fd,NULL);
close(ep_events[i].data.fd);
printf("closed client:%d \n",ep_events[i].data.fd);
}
else
{
char method[10];
char ct[15]="text/plain";
char file_name[BUF_SIZE];
char req_line[BUF_SIZE];
int clnt_sock=ep_events[i].data.fd;
int ii=0;
for(ii=0;buf[ii]!='\n';ii++)
{
req_line[ii]=buf[ii];
}
req_line[ii]='\0';
printf("analysis http message!\n");
if(strstr(buf,"HTTP/")==NULL)
{
printf("HTTP wrong");
send_error(ep_events[i].data.fd);
}
FILE *clnt_read;
// clnt_read=fdopen(clnt_sock,"r");
// fgets(req_line,BUF_SIZE,clnt_read);
strcpy(method,strtok(req_line," /"));
printf("http method is %s\n",method);
strcpy(file_name,strtok(NULL," /"));
printf("http filename is %s\n",file_name);
// strcpy(ct,content_type(file_name));
printf("http content type is %s\n",ct);
if(strcmp(method,"GET")==0||strcmp(method,"POST")==0)
{
if(strcmp(method,"GET")==0)
{
printf("进入send_data()\n");
char protocol[] = "HTTP/1.0 200 OK\r\n";
char server[] = "server: ubuntu Web Server\r\n";
char cnt_len[] = "Content-length: 2048\r\n";
char cnt_type[BUF_SIZE];
char buffile[BUF_SIZE];
sprintf(cnt_type,"Content-type:%s\r\n\r\n",ct);
FILE* send_file;
sprintf(cnt_type,"Content-type:%s\r\n\r\n",ct);
send_file = fopen(file_name,"r");
if(send_file == NULL)
{
printf("open file wrong!\n");
send_error(epfd); return ;
}
send(ep_events[i].data.fd,protocol,strlen(protocol),0);
send(ep_events[i].data.fd,server,strlen(server),0);
send(ep_events[i].data.fd,cnt_len,strlen(cnt_len),0);
send(ep_events[i].data.fd,cnt_type,strlen(cnt_type),0);
//fputs(server,fp);
// fputs(cnt_len,fp);
//fputs(cnt_type,fp);
while (fgets(buffile,BUF_SIZE,send_file) != NULL)
{
printf("send_data wait()\n");
send(ep_events[i].data.fd,buffile,strlen(buffile),0);
}
fclose(send_file);
send(ep_events[i].data.fd,"\n\r",2,0);
printf("data is transfer sucess!\n");
close(ep_events[i].data.fd);
//return 1;
continue;
// break;
}
else if(strcmp(method,"POST")==0)
{
printf("recieve http request is: %s\n",buf);
int len=0;
char str1[BUF_SIZE];
char str[BUF_SIZE];
char str2[4096];
memset(str2, 0, 4096);
memset(str1, 0, 4096);
strcat(str1, "HTTP/1.0 200 OK\n");
strcat(str1, "Host: 127.0.0.1\n");
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n");
strcat(str1, "Content-Length: ");
sprintf(str1,"%d", 1024);
strcat(str1, "\n\n");
strcat(str1, "\r\n\r\n");
printf("%s\n",str1);
int ret = write(ep_events[i].data.fd,str1,strlen(str1));
if (ret < 0) {
printf("发送失败!错误代码是%d,错误信息是'%s'\n", errno, strerror(errno));
exit(0);
}
else
{
printf("消息发送成功,共发送了%d个字节!\n\n", ret);
}
} else
{
printf("wrong");
send_error(ep_events[i].data.fd);
}
}
}
}
}
}
close(serv_sock);
close(epfd);
return 0;
}
void error_handling(char *buf)
{
fputs(buf,stderr);
fputc('\n',stderr);
exit(1);
}
void* content_type(char* file)
{
char extension[BUF_SIZE];
char file_name[BUF_SIZE];
strcpy(file_name,file);
strtok(file_name,".");
strcpy(extension,strtok(NULL,"."));
if( strcmp(extension,"html")==0 || strcmp(extension,"htm")==0 )
return "text/html";
return "text/plain";
}
void send_error(int epfd)
{
printf("进入 send_error!\n");
char protocol[] = "HTTP/1.0 400 Bad Request\r\n";
char server[] = "Server: linux Web Server \r\n";
char cnt_len[] = "Content-length:2048\r\n";
char cnt_type[] = "content-type: text/html\r\n\r\n";
//char cnt_type[BUF_SIZE];
// sprintf(cnt_type,"Content-type:%s\r\n\r\n",ct);
char content[] = "<html> <head><title>NETWORK</title></head><body><font size=+5><br>error!!!</font></body></html>";
send(epfd,protocol,strlen(protocol),0);
send(epfd,server,strlen(server),0);
send(epfd,cnt_len,strlen(cnt_len),0);
send(epfd,cnt_type,strlen(cnt_type),0);
}
void send_data(int epfd,char* ct, char* file_name)
{
printf("进入send_data()\n");
char protocol[] = "HTTP/1.0 200 OK\r\n";
char server[] = "server: linux Web Server lian\r\n";
char cnt_len[] = "Content-length: 2048\r\n";
char cnt_type[BUF_SIZE];
char buf[BUF_SIZE];
sprintf(cnt_type,"Content-type:%s\r\n\r\n",ct);
FILE* send_file;
sprintf(cnt_type,"Content-type:%s\r\n\r\n",ct);
send_file = fopen(file_name,"r");
if(send_file == NULL)
{
printf("open file wrong!\n");
send_error(epfd); return ;
}
send(epfd,protocol,strlen(protocol),0);
send(epfd,server,strlen(server),0);
send(epfd,cnt_len,strlen(cnt_len),0);
send(epfd,cnt_type,strlen(cnt_type),0);
while (fgets(buf,BUF_SIZE,send_file) != NULL)
{
printf("send_data wait()\n");
send(epfd,buf,strlen(buf),0);
}
send(epfd,"\n\r",2,0);
}
HTTP项目,EPOLL版,包含GET/POST方法
最新推荐文章于 2024-05-23 22:54:45 发布