核心代码,所有代码在这里下载
#include "unixnet.h"
#include "chat.h"
#include "sys/epoll.h"
int main (int argc, char *argv[])
{
int listen_fd;
socklen_t cli_len;
struct sockaddr_in cli_addr,serv_addr;
int ret,flags;
int re_use_addr=1;
char recv_buf[MAXLINE];
int i;
int efd;
struct epoll_event event;
struct epoll_event events[MAXUSERS];
for(i=0; i<MAXUSERS; i++)
{
chater[i].slot_status =SLOT_FREED ;
chater[i].sock_fd =-1;
chater[i].cmd .cmd_type =-1;
}
listen_fd = socket(AF_INET,SOCK_STREAM,0);
if(listen_fd==-1)
{
perror("create listen fd");
exit(1);
}
bzero(&serv_addr ,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERVER_PORT );
setsockopt(listen_fd, SOL_SOCKET,SO_REUSEADDR,(void
*)&re_use_addr,sizeof(int));
ret=bind(listen_fd,(struct sockaddr
*)&serv_addr,sizeof(serv_addr));
if(ret<0)
{
perror("bind server port");
exit(1);
}
listen(listen_fd,LISTENQ);
if((flags=fcntl(listen_fd,F_GETFL,flags)<0))
{
perror("F_SETFL error");
}
flags|=O_NONBLOCK;
if(fcntl(listen_fd,F_SETFL,flags)<0)
{
perror("F_SETFL error");
}
efd = epoll_create(MAXUSERS);
event.data.fd = listen_fd;
event.events = EPOLLET| EPOLLIN;
epoll_ctl(efd, EPOLL_CTL_ADD, listen_fd, &event);
printf("listen_fd %d\n",listen_fd);
while(1){
int n,i;
n = epoll_wait(efd, events, MAXUSERS,-1);
for(i = 0;i < n;++i){
if ((events[i].events & EPOLLERR) ||
(events[i].events & EPOLLHUP) ||
(!(events[i].events & EPOLLIN))) {
fprintf (stderr, "epoll error\n");
free_slot(findSlotIndexByConnFd(events[i].data.fd));
epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,NULL);
continue;
}else if(listen_fd == events[i].data.fd){
int infd = -1;
while((infd = accept(listen_fd,(struct sockaddr *)&cli_addr,&cli_len)) > 0){
get_free_slot(infd, "no_login");
event.data.fd = infd;
event.events = EPOLLIN | EPOLLET;
epoll_ctl(efd, EPOLL_CTL_ADD, infd, &event);
writen(infd,message[2],strlen(message [2]));
printf("accept one\n");
}
if(infd == -1){
printf("%d\n",errno);
}
}else{
int infd = events[i].data.fd;
int index = -1;
char *ptr;
index = findSlotIndexByConnFd(infd);
ptr=&(chater[index].buffer[chater[index].next_char]);
if(index != -1){
while((n=read(infd ,ptr,1))==1)
{
if(*ptr=='\n')
{
*(ptr+1)='\0';
chater[index].next_char =0;
break;
}
if(++chater[index].next_char ==MAXLINE)
--chater[index].next_char ;
else
++ptr;
}
if(n == 0 || (n == -1&&errno!=EWOULDBLOCK)){
free_slot(findSlotIndexByConnFd(events[i].data.fd));
epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,NULL);
printf("user %s use slot_index %d logout\n\n",chater[index].user_id, index);
continue;
}
if(!chater[index].user_assigned){
copyStringSkipSpace(chater[index].user_id,chater[index].buffer);
chater[index].user_assigned = 1;
printf("user %s use slot_index %d login\n\n",chater[index].user_id, index);
}else{
handle_cmd(index);
}
}
}
}
}
}