epoll_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ctype.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <errno.h>
#define MAXLINE 80
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666
#define OPEN_MAX 1024
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
int main(int argc, char const *argv[])
{
int i,j,listenfd,connfd,sockfd;
int nready,efd,res;
ssize_t n;
char buf[MAXLINE];
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
struct epoll_event tep,ep[OPEN_MAX];
listenfd = socket(PF_INET,SOCK_STREAM,0);
if (listenfd == -1)
error_handing("socket() error");
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(SERV_IP);
servaddr.sin_port = htons(SERV_PORT);
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
error_handing("bind() error");
if(listen(listenfd,5) == -1)
error_handing("listen() error");
efd = epoll_create(OPEN_MAX);
if(efd == -1)
error_handing("epoll_create() error");
tep.events = EPOLLIN;
tep.data.fd = listenfd;
res = epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep);
if (res == -1)
error_handing("epoll_ctl() error");
while(1)
{
nready = epoll_wait(efd,ep,OPEN_MAX,-1); //阻塞监听
if(nready == -1)
error_handing("epoll_wait() error");
for(i = 0;i<nready;i++)
{
if(!(ep[i].events & EPOLLIN))
continue;
if(ep[i].data.fd == listenfd) //new connect
{
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen)) == -1)
error_handing("accept() error");
printf("client ip:%s,port:%d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port) );
tep.events = EPOLLIN;
tep.data.fd = connfd;
res = epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep);
if(res == -1)
error_handing("epoll_ctl() error");
}else
{
sockfd = ep[i].data.fd;
n = read(sockfd,buf,MAXLINE);
if(n == -1)
error_handing("read() error");
else if( n == 0)
{
res = epoll_ctl(efd,EPOLL_CTL_DEL,sockfd,NULL);
if(res == -1)
error_handing("epoll_ctl() error");
close(sockfd);
printf("client[%d] closed connection\n",sockfd );
}else
{
write(STDOUT_FILENO,buf,n);
for(j = 0;j<n;j++)
{
buf[j] = toupper(buf[j]);
}
write(sockfd,buf,n);
}
}
}
}
close(listenfd);
close(efd);
return 0;
}
epoll_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
void error_handing(const char *message);
int main(int argc, char const *argv[])
{
char message[BUF_SIZE];
int str_len,recv_len,recv_cnt;
if (argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0]);
exit(1);
}
int sock;
sock = socket(PF_INET,SOCK_STREAM,0);
if(sock == -1)
{
error_handing("socket() error");
}
struct sockaddr_in serv_adr;
memset(&serv_adr,0,sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
serv_adr.sin_port = htons(atoi(argv[2]));
if(connect(sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr)) == -1)
{
error_handing("connect() error");
}else
puts("Connected............");
while(1)
{
memset(&message,0,sizeof(message));
fputs("Input message(Q to quit): ",stdout);
fgets(message,BUF_SIZE,stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
str_len = write(sock,message,strlen(message));
recv_len = 0;
while(recv_len < str_len)
{
recv_cnt = read(sock,&message[recv_len],BUF_SIZE - 1);
if(recv_cnt == -1)
{
error_handing("read() error");
}
recv_len += recv_cnt;
}
message[recv_len] = 0;
printf("Message from server: %s",message );
}
close(sock);
return 0;
}
void error_handing(const char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}