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 |