栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#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 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
				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 =%dnn",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 %sn",inet_ntoa(clnt_adr.sin_addr));
				}
				else
				{
					printf("read client'datan");
					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]='';

						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 %sn",method);
						strcpy(file_name,strtok(NULL," /"));
						printf("http filename is %sn",file_name);
					//	strcpy(ct,content_type(file_name));
						printf("http content type is %sn",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 OKrn";
                         	        char server[] = "server: ubuntu Web Serverrn";
                                	char cnt_len[] = "Content-length: 2048rn";
                                	char cnt_type[BUF_SIZE];
                                	char buffile[BUF_SIZE];
                        	       sprintf(cnt_type,"Content-type:%srnrn",ct);
                                	FILE* send_file;
                                	sprintf(cnt_type,"Content-type:%srnrn",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,"nr",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: %sn",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 OKn");
									strcat(str1, "Host: 127.0.0.1n");
									strcat(str1, "Content-Type: application/x-www-form-urlencodedn");
									strcat(str1, "Content-Length: ");
									 sprintf(str1,"%d", 1024);
									strcat(str1, "nn");
															       strcat(str1, "rnrn");
						            printf("%sn",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个字节!nn", 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 Requestrn";
	 char server[] = "Server: linux Web Server rn";
	 char cnt_len[] = "Content-length:2048rn";
	 char cnt_type[] = "content-type: text/htmlrnrn";
	 //char cnt_type[BUF_SIZE];
	// sprintf(cnt_type,"Content-type:%srnrn",ct);
	char content[] = " NETWORK
error!!!
"; 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 OKrn"; char server[] = "server: linux Web Server lianrn"; char cnt_len[] = "Content-length: 2048rn"; char cnt_type[BUF_SIZE]; char buf[BUF_SIZE]; sprintf(cnt_type,"Content-type:%srnrn",ct); FILE* send_file; sprintf(cnt_type,"Content-type:%srnrn",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,"nr",2,0); }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号