Commit eeb7695e2e1cc5f5b3b1054fe5297f1e6daccae2

Authored by Grzegorz Jabłoński
1 parent 0354f793

Using recv with nonblocking flag

Showing 1 changed file with 3 additions and 19 deletions
epoll4.c
... ... @@ -62,20 +62,6 @@ static void set_sockaddr(struct sockaddr_in *addr) {
62 62 addr->sin_port = htons(DEFAULT_PORT);
63 63 }
64 64  
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   -
72   - if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK) == -1) {
73   - perror("fcntl");
74   - exit(1);
75   - }
76   - return 0;
77   -}
78   -
79 65 /*
80 66 * epoll echo server
81 67 */
... ... @@ -113,7 +99,6 @@ void server_run() {
113 99 exit(1);
114 100 }
115 101  
116   - setnonblocking(listen_sock);
117 102 if (listen(listen_sock, MAX_CONN) < 0) {
118 103 perror("listen");
119 104 exit(1);
... ... @@ -145,13 +130,12 @@ void server_run() {
145 130 inet_ntop(AF_INET, (char *)&(cli_addr.sin_addr), buf, sizeof(buf));
146 131 printf("[+] connected with %s:%d\n", buf, ntohs(cli_addr.sin_port));
147 132  
148   - setnonblocking(conn_sock);
149 133 epoll_ctl_add(epfd, conn_sock,
150 134 EPOLLIN | EPOLLET | EPOLLRDHUP | EPOLLHUP);
151 135 } else if (events[i].events & EPOLLIN) {
152 136 /* handle EPOLLIN event */
153 137 for (;;) {
154   - n = read(events[i].data.fd, buf, sizeof(buf) - 1);
  138 + n = recv(events[i].data.fd, buf, sizeof(buf) - 1, MSG_DONTWAIT);
155 139 if (n == -1 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) {
156 140 break;
157 141 } else if (n == 0) {
... ... @@ -163,8 +147,8 @@ void server_run() {
163 147 while (n != strlen(buf)) {
164 148 int rv = send(events[i].data.fd, buf + n, strlen(buf) - n,
165 149 MSG_NOSIGNAL);
166   - if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
167   - continue; // FIXME: busy waiting - should wait using epoll
  150 + if (rv == -1 && (errno == EINTR))
  151 + continue; // FIXME: might lock up due to client not receiving - should wait using epoll
168 152 if (rv == -1)
169 153 break;
170 154 n += rv;
... ...