summaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c56
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);
}