您的位置:首页 > 其它

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: