Skip to content

Commit 9a2f2a9

Browse files
committed
epoll demo
1 parent ef64974 commit 9a2f2a9

File tree

2 files changed

+113
-1
lines changed

2 files changed

+113
-1
lines changed

c/epoll/epoll_client.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,117 @@ static void modify_event(int epollfd, int fd, int state);
2626

2727
int main(int argc, char *argv[])
2828
{
29+
int sockfd;
30+
struct sockaddr_in servaddr;
31+
sockfd = socket(AF_INET, SOCK_STREAM, 0);
32+
bzero(&servaddr, sizeof(servaddr));
33+
servaddr.sin_family = AF_INET;
34+
servaddr.sin_port = htons(SERV_PORT);
35+
inet_pton(AF_INET, IPADDRESS, &servaddr.sin_addr);
36+
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
37+
// 处理链接
38+
handle_connection(sockfd);
39+
close(sockfd);
2940
return 0;
3041
}
42+
43+
static void handle_connection(int sockfd)
44+
{
45+
int epollfd;
46+
struct epoll_event events[EPOLLEVENTS];
47+
char buf[MAXSIZE];
48+
int ret;
49+
epollfd = epoll_create(FDSIZE);
50+
add_event(epollfd, STDIN_FILENO, EPOLLIN);
51+
for ( ; ; )
52+
{
53+
ret = epoll_wait(epollfd, events, EPOLLEVENTS, -1);
54+
handle_events(epollfd, events, ret, sockfd, buf);
55+
}
56+
close(epollfd);
57+
}
58+
59+
60+
static void handle_events(int epollfd, struct epoll_event *events,
61+
int num, int sockfd, char *buf)
62+
{
63+
int fd;
64+
int i;
65+
for (i = 0; i < num; i++)
66+
{
67+
fd = events[i].data.fd;
68+
if (events[i].events & EPOLLIN)
69+
do_read(epollfd, fd, sockfd, buf);
70+
else if (events[i].events & EPOLLOUT)
71+
do_write(epollfd, fd, sockfd, buf);
72+
}
73+
}
74+
75+
static void do_read(int epollfd, int fd, int sockfd, char *buf)
76+
{
77+
int nread;
78+
nread = read(fd, buf, MAXSIZE);
79+
if (nread == -1)
80+
{
81+
perror("read error:");
82+
close(fd);
83+
}
84+
else if (nread == 0)
85+
{
86+
fprintf(stderr, "server close.\n");
87+
close(fd);
88+
}
89+
else
90+
{
91+
if (fd == STDIN_FILENO)
92+
add_event(epollfd, sockfd, EPOLLOUT);
93+
else
94+
{
95+
delete_event(epollfd, sockfd, EPOLLIN);
96+
add_event(epollfd, STDOUT_FILENO, EPOLLOUT);
97+
}
98+
}
99+
}
100+
101+
static void do_write(int epollfd, int fd, int sockfd, char *buf)
102+
{
103+
int nwrite;
104+
nwrite = write(fd, buf, strlen(buf));
105+
if (nwrite == -1)
106+
{
107+
perror("write error:");
108+
close(fd);
109+
}
110+
else
111+
{
112+
if (fd == STDOUT_FILENO)
113+
delete_event(epollfd, fd, EPOLLOUT);
114+
else
115+
modify_event(epollfd, fd, EPOLLIN);
116+
}
117+
memset(buf, 0, MAXSIZE);
118+
}
119+
120+
static void add_event(int epollfd, int fd, int state)
121+
{
122+
struct epoll_event ev;
123+
ev.events = state;
124+
ev.data.fd = fd;
125+
epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
126+
}
127+
128+
static void delete_event(int epollfd, int fd, int state)
129+
{
130+
struct epoll_event ev;
131+
ev.events = state;
132+
ev.data.fd = fd;
133+
epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, &ev);
134+
}
135+
136+
static void modify_event(int epollfd, int fd, int state)
137+
{
138+
struct epoll_event ev;
139+
ev.events = state;
140+
ev.data.fd = fd;
141+
epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &ev);
142+
}

c/epoll/epoll_server.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ handle_events(int epollfd, struct epoll_event *events, int num, int listenfd, ch
9999
int i;
100100
int fd;
101101
// 进行选好遍历
102-
for (i = 0; i < num, i++)
102+
for (i = 0; i < num; i++)
103103
{
104104
fd = events[i].data.fd;
105105
// 根据描述符的类型和事件类型进行处理

0 commit comments

Comments
 (0)