Commit 0354f79351baa7a4355ba3d6141fe19d95386439
1 parent
d7575a75
Added more error handling
Showing
1 changed file
with
30 additions
and
9 deletions
epoll4.c
1 | -/* | ||
2 | - * Attention: | ||
3 | - * To keep things simple, do not handle | ||
4 | - * socket/bind/listen/.../epoll_create/epoll_wait API error | ||
5 | - */ | ||
6 | #include <arpa/inet.h> | 1 | #include <arpa/inet.h> |
7 | #include <errno.h> | 2 | #include <errno.h> |
8 | #include <fcntl.h> | 3 | #include <fcntl.h> |
@@ -68,9 +63,15 @@ static void set_sockaddr(struct sockaddr_in *addr) { | @@ -68,9 +63,15 @@ static void set_sockaddr(struct sockaddr_in *addr) { | ||
68 | } | 63 | } |
69 | 64 | ||
70 | static int setnonblocking(int sockfd) { | 65 | static int setnonblocking(int sockfd) { |
66 | + int prev = fcntl(sockfd, F_GETFL, 0); | ||
67 | + if (prev == -1) { | ||
68 | + perror("fcntl"); | ||
69 | + exit(1); | ||
70 | + } | ||
71 | + | ||
71 | if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK) == -1) { | 72 | if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK) == -1) { |
72 | - perror("fcntl set nonblock"); | ||
73 | - return -1; | 73 | + perror("fcntl"); |
74 | + exit(1); | ||
74 | } | 75 | } |
75 | return 0; | 76 | return 0; |
76 | } | 77 | } |
@@ -93,12 +94,19 @@ void server_run() { | @@ -93,12 +94,19 @@ void server_run() { | ||
93 | 94 | ||
94 | listen_sock = socket(AF_INET, SOCK_STREAM, 0); | 95 | listen_sock = socket(AF_INET, SOCK_STREAM, 0); |
95 | 96 | ||
97 | + if (listen_sock == -1) { | ||
98 | + perror("socket"); | ||
99 | + exit(1); | ||
100 | + } | ||
101 | + | ||
96 | set_sockaddr(&srv_addr); | 102 | set_sockaddr(&srv_addr); |
97 | 103 | ||
98 | int reuseaddr = 1; | 104 | int reuseaddr = 1; |
99 | if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, | 105 | if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, |
100 | - sizeof(int)) < 0) | 106 | + sizeof(int)) < 0) { |
101 | perror("setsockopt(SO_REUSEADDR)"); | 107 | perror("setsockopt(SO_REUSEADDR)"); |
108 | + exit(1); | ||
109 | + } | ||
102 | 110 | ||
103 | if (bind(listen_sock, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) { | 111 | if (bind(listen_sock, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) { |
104 | perror("bind"); | 112 | perror("bind"); |
@@ -112,6 +120,11 @@ void server_run() { | @@ -112,6 +120,11 @@ void server_run() { | ||
112 | } | 120 | } |
113 | 121 | ||
114 | epfd = epoll_create(1); | 122 | epfd = epoll_create(1); |
123 | + if (epfd == -1) { | ||
124 | + perror("epoll_create"); | ||
125 | + exit(1); | ||
126 | + } | ||
127 | + | ||
115 | epoll_ctl_add(epfd, listen_sock, EPOLLIN | EPOLLOUT); | 128 | epoll_ctl_add(epfd, listen_sock, EPOLLIN | EPOLLOUT); |
116 | 129 | ||
117 | socklen = sizeof(cli_addr); | 130 | socklen = sizeof(cli_addr); |
@@ -164,7 +177,11 @@ void server_run() { | @@ -164,7 +177,11 @@ void server_run() { | ||
164 | /* check if the connection is closing */ | 177 | /* check if the connection is closing */ |
165 | if (events[i].events & (EPOLLRDHUP | EPOLLHUP)) { | 178 | if (events[i].events & (EPOLLRDHUP | EPOLLHUP)) { |
166 | printf("[+] connection closed\n"); | 179 | printf("[+] connection closed\n"); |
167 | - epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL); | 180 | + |
181 | + if (epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL) == -1) { | ||
182 | + perror("epoll_ctl"); | ||
183 | + exit(1); | ||
184 | + } | ||
168 | close(events[i].data.fd); | 185 | close(events[i].data.fd); |
169 | continue; | 186 | continue; |
170 | } | 187 | } |
@@ -183,6 +200,10 @@ void client_run() { | @@ -183,6 +200,10 @@ void client_run() { | ||
183 | struct sockaddr_in srv_addr; | 200 | struct sockaddr_in srv_addr; |
184 | 201 | ||
185 | sockfd = socket(AF_INET, SOCK_STREAM, 0); | 202 | sockfd = socket(AF_INET, SOCK_STREAM, 0); |
203 | + if (sockfd == -1) { | ||
204 | + perror("socket"); | ||
205 | + exit(1); | ||
206 | + } | ||
186 | 207 | ||
187 | set_sockaddr(&srv_addr); | 208 | set_sockaddr(&srv_addr); |
188 | 209 |