diff options
Diffstat (limited to 'src/client.c')
| -rw-r--r-- | src/client.c | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/src/client.c b/src/client.c index 5b87c37..45a3c39 100644 --- a/src/client.c +++ b/src/client.c @@ -1,7 +1,10 @@ #include <err.h> #include <string.h> +#include <errno.h> #include <stdio.h> +#include <fcntl.h> #include <stdlib.h> +#include <poll.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> @@ -44,29 +47,62 @@ int main() return -1; } - int c; - while ((c = fgetc(stdin)) != EOF) { - char cb = c; - int ret = write(tcp_sock, &cb, 1); - if (ret == -1) { - err(EXIT_FAILURE, "failed writing to socket"); + ret = fcntl(tcp_sock, F_SETFL, O_NONBLOCK); + if (ret == -1) { + close(tcp_sock); + return ret; + } + + struct pollfd polls[2] = {{ + .fd = STDIN_FILENO, + .events = POLLIN + }, { + .fd = tcp_sock, + .events = POLLIN } + }; - if (cb == '\n') { - char buf[4096]; - ret = read(tcp_sock, buf, 4096); + while (poll(polls, 2, -1)) { + if (polls[0].revents) { + char cb = 'a'; + + int ret = read(STDIN_FILENO, &cb, 1); if (ret == -1) { - printf("Error\n"); + err(EXIT_FAILURE, "failed reading from stdio"); + } + + if (ret == 0) { break; } + ret = write(tcp_sock, &cb, 1); + if (ret == -1) { + err(EXIT_FAILURE, "failed writing to socket"); + } + } + + if (polls[1].revents) { + if (polls[1].revents & POLLHUP) { + printf("Closed socket\n"); + break; + } + + char buf[4096]; + int ret = read(tcp_sock, buf, 4096 - 1); + if (ret == -1 && errno != EWOULDBLOCK) { + err(EXIT_FAILURE, "failed reading from socket"); + } + if (ret == 0) { printf("Closed socket\n"); break; } + + buf[ret] = '\0'; printf("%s\n", buf); } } + close(tcp_sock); } |
