linux network server (epoll)

다중접속이 처리되기는 하지만 write(); 앞에 sleep(10); 등을 넣어서 컴파일 후 클라이언트 두개를 동시에 사용하면 한개씩 처리하는것을 알 수 있다.
다중스레드를 사용하지 않는 한 간단한 일밖에 하지 못한다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/epoll.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#define SA struct sockaddr
#define EPOLL_SIZE 20

int main(int argc,char *argv[])
{
	struct sockaddr_in addr,clientaddr;
	struct eph_comm *conn;
	int sfd;
	int cfd;
	int clilen;
	int flags=1;
	int n,i;
	int readn;
	struct epoll_event *events;

	int efd;
	char buf_in[256];

	events=(struct epoll_event *) malloc(sizeof(*events)*EPOLL_SIZE);
	if((efd=epoll_create(EPOLL_SIZE))<0)
	{
		perror("epoll_create error:");
		return 1;
	}

	clilen=sizeof(clientaddr);
	sfd=socket(AF_INET,SOCK_STREAM,0);

	if(sfd==-1)
	{
		perror("socket error:");
		close(sfd);
		return 1;
	}
	addr.sin_family=AF_INET;
	addr.sin_port=htons(4445);
	addr.sin_addr.s_addr=htons(INADDR_ANY);
	if(bind(sfd,(struct sockaddr *) &addr,sizeof(addr))==-1)
	{
		close(sfd);
		return 1;
	}
	listen(sfd,5);

	events->events=EPOLLIN;
	events->data.fd=sfd;
	epoll_ctl(efd,EPOLL_CTL_ADD,sfd,events);

	while(1)
	{
		n=epoll_wait(efd,events,EPOLL_SIZE,-1);
		if(n==-1)
		{
			perror("epoll wait error:");
		}
		for(i=0;i<n;i++)
		{
			if(events[i].data.fd==sfd)
			{
				//printf("Accept:");
				cfd=accept(sfd,(SA *) &clientaddr,&clilen);
				printf("Accept: %d\n",cfd);
				events->events=EPOLLIN;
				events->data.fd=cfd;
				epoll_ctl(efd,EPOLL_CTL_ADD,cfd,events);
			}
			else
			{
				memset(buf_in,0x00,256);
				readn=read(events[i].data.fd,buf_in,255);
				if(readn<=0)
				{
					epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,events);
					close(events[i].data.fd);
					printf("Close: %d\n",events[i].data.fd);
				}
				else
				{
					printf("read data: %s",buf_in);
					/*
					int count;
					for(count=0;count<readn;count++)
					{
						printf("0x%02x ",buf_in[count]);
					}
					*/
					if(strcmp(buf_in,"exit\x0d\x0a")==0)
					{
						write(events[i].data.fd,"bye!!\n",6);
						epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,events);
						close(events[i].data.fd);
						printf("Exit: %d\n",events[i].data.fd);
					}
					else
					{
						write(events[i].data.fd,buf_in,strlen(buf_in));
					}
				}
			}
		}
	}
}

kjwon15

I'm a hacker, I want to improve life.

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.