HTTP项目,EPOLL版,包含GET/POST方法

#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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值