epoll更新实例
2015-04-17 17:34
57 查看
#ifndef _MY_ARRAY_H_INCLUDE_ #define _MY_ARRAY_H_INCLUDE_ typedef struct my_array_s my_array_t; struct my_array_s { void *elts; u_int nelts; size_t size; u_int nalloc; }; my_array_t* my_array_create(u_int n,size_t size); void* my_array_push(my_array_t*a); int my_array_delete(my_array_t*a,int elem); #endif
#include "my_utils.h" my_array_t* my_array_create(u_int n,size_t size) { my_array_t *a; a=malloc(sizeof(my_array_t)); if(a==NULL) return NULL; a->elts=malloc(n*size); if(a->elts==NULL) return NULL; a->size=size; a->nelts=0; a->nalloc=n; return a; } void* my_array_push(my_array_t*a) { void *elt; if(a->nelts==a->nalloc||a->elts==NULL) return NULL; elt=a->elts+a->nelts*a->size; a->nelts++; return elt; } int my_array_delete(my_array_t*a,int elem) { u_int i,j; int *elt; if(a->nelts==0||a->elts==NULL) return -1; for(elt=a->elts,i=0;i<a->nelts;i++){ if(elt[i]!=elem) continue; break; } if(i>=a->nelts) return -1; for(elt=a->elts,j=i+1;j<a->nelts;i++,j++) elt[i]=elt[j]; a->nelts--; return 1; }
#ifndef _MY_UTILS_H_INCLUDE_ #define _MY_UTILS_H_INCLUDE_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/epoll.h> #include <sys/ioctl.h> #include "my_array.h" #define BUF_SIZE 1024 #define EPOLL_SIZE 1000 #define SERVER_PORT 4444 #define SERVER_HOST "192.168.1.101" #define STR_MESSAGE "Client# %d>>%s" #define STR_WELCOME "Welcome to sechat!You ID is#%d>>" #define STR_NOON_OTER "Noclient except you!" #define STR_QUIT "Client#%d quit" #define STR_ENTER "Client#%d enter" #define oops(msg) {perror(msg);exit(0);} int set_nonblocking(int fd); int handle_message(int fd,int flag); #endif
#include "my_utils.h" int set_nonblocking(int fd) { int nb=1; return ioctl(fd,FIONBIO,&nb); }
#include "my_utils.h" my_array_t *clients_list; int main(int ac,char**av) { struct sockaddr_in server_addr,client_addr; struct epoll_event ev,events[EPOLL_SIZE]; int rc,listen_fd,client_fd,epoll_fd,*elem; char message[BUF_SIZE]; u_int events_count,i; socklen_t client_addr_len; server_addr.sin_family=AF_INET; server_addr.sin_port=htons(SERVER_PORT); server_addr.sin_addr.s_addr=inet_addr(SERVER_HOST); listen_fd=socket(AF_INET,SOCK_STREAM,0); if(listen_fd<0) oops("socket"); if(bind(listen_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))<0) oops("bind"); if(listen(listen_fd,5)<0) oops("listen"); epoll_fd=epoll_create(EPOLL_SIZE); if(epoll_fd<0) oops("epoll_create"); ev.events=EPOLLIN; ev.data.fd=listen_fd; if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,listen_fd,&ev)<0) oops("epoll_ctl"); clients_list=my_array_create(EPOLL_SIZE,sizeof(int)); if(clients_list==NULL) oops("my_array_create"); for(;;){ events_count=epoll_wait(epoll_fd,events,EPOLL_SIZE,-1); if(events_count<0) oops("epoll_wait"); for(i=0;i<events_count;i++){ if(events[i].data.fd==listen_fd){ client_addr_len=sizeof(client_addr); client_fd=accept(listen_fd,(struct sockaddr*)&client_addr, &client_addr_len); if(client_fd<0) oops("accept"); elem=my_array_push(clients_list); if(elem==NULL) oops("array_push"); *elem=client_fd; ev.data.fd=client_fd; if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,client_fd,&ev)<0) oops("epoll_ctl"); sprintf(message,STR_WELCOME,client_fd); if(send(client_fd,message,strlen(message),0)<0) oops("send"); if(handle_message(client_fd,0)<0) oops("handle_message 0"); }else{ if(handle_message(events[i].data.fd,1)<0) oops("handle_message 1"); } } } close(listen_fd); close(epoll_fd); return 0; } int handle_message(int fd,int flag) { char buf[BUF_SIZE],message[BUF_SIZE]; size_t len; u_int i; int *elt; bzero(buf,BUF_SIZE); bzero(message,BUF_SIZE); if(flag) { len=recv(fd,buf,BUF_SIZE,0); if(len<0) return -1; if(len==0){// quit sprintf(message,STR_QUIT,fd); if(my_array_delete(clients_list,fd)<0){ return -1; } close(fd); }else {// normal if(clients_list->nelts==1){ sprintf(message,STR_MESSAGE,fd,buf); printf("%s\n",message); sprintf(message,STR_NOON_OTER); if(send(fd,message,strlen(message),0)<0){ return -1; } return 1; } sprintf(message,STR_MESSAGE,fd,buf); } }else{ sprintf(message,STR_ENTER,fd); } printf("%s\n",message); for(i=0,elt=clients_list->elts;i<clients_list->nelts;i++){ if(elt[i]!=fd) if(send(elt[i],message,strlen(message),0)<0) return -1; } return 1; }
obj=my_utils.o my_array.o my_server.o main=main $(main):$(obj) gcc -o $(main) $(obj) my_utils.o: my_array.o: my_server.o: clean: rm -rf $(obj) $(main)
make 后生成server的main可执行文件
my_client.c:
#include "my_utils.h" int main(int ac,char**av) { struct sockaddr_in server_addr; struct epoll_event ev,events[2]; char message[BUF_SIZE]; int rc,conn_fd,epoll_fd,in_fd; u_int events_count=0,i; server_addr.sin_family=AF_INET; server_addr.sin_port=htons(SERVER_PORT); server_addr.sin_addr.s_addr=inet_addr(SERVER_HOST); conn_fd=socket(AF_INET,SOCK_STREAM,0); if(conn_fd<0) oops("socket"); if(connect(conn_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))<0) oops("connect"); epoll_fd=epoll_create(EPOLL_SIZE); if(epoll_fd<0) oops("epoll_create"); ev.events=EPOLLIN; ev.data.fd=conn_fd; if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,conn_fd,&ev)<0) oops("epoll_ctl"); in_fd=fileno(stdin); ev.data.fd=in_fd; if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,in_fd,&ev)<0) oops("epoll_ctl"); for(;;){ events_count=epoll_wait(epoll_fd,events,EPOLL_SIZE,-1); if(events_count<0) oops("epoll_wait"); for(i=0;i<events_count;i++){ if(events[i].data.fd==conn_fd){ bzero(message,BUF_SIZE); rc=recv(conn_fd,message,BUF_SIZE,0); if(rc<0) oops("recv"); if(rc==0){ close(conn_fd); printf("server closed\n"); exit(0); } printf("%s\n",message); } if(events[i].data.fd==in_fd){ bzero(message,BUF_SIZE); if(fgets(message,BUF_SIZE,stdin)==NULL) oops("fgets"); if(send(conn_fd,message,strlen(message)-1,0)<0) oops("send"); } } } return 0; }
obj=my_utils.o my_array.o my_client.o
main=main
$(main):$(obj)
gcc -o $(main) $(obj)
my_utils.o:
my_array.o:
my_client.o:
clean:
rm -rf $(obj) $(main)
相关文章推荐
- epoll实例
- Android 增量更新实例(Smart App Updates)
- 非常实用的小功能 Android应用版本的更新实例
- Ajax 全选、反选、取消、添加、删除、更新Checkbox实例
- Unity热更新专题(九)Unity热更新实例
- 中国区Azure基本实例更新
- epoll_create, epoll_ctl和epoll_wait 实例讲解,总结得不错
- .NET更新Xml中CDATA内容的方法实例
- epoll模型实例
- 页面实时更新时间的JS实例代码
- LFM,LSI,LDA讲解与实例(不断更新)
- [转载]Hibernate批量更新与删除实例浅析
- Linux网络编程--epoll 模型原理详解以及实例
- 【实例】赵雅智_login(5)更新
- Linux Epoll介绍和程序实例
- epoll_create, epoll_ctl和epoll_wait 实例讲解,总结得不错
- [置顶] [Unity XLua]热更新XLua入门(二)-俄罗斯方块实例篇
- Linux Epoll介绍和程序实例(转)
- epoll介绍及程序实例
- RAC常用管理命令--集群、实例、资源管理-更新中