summaryrefslogtreecommitdiff
path: root/src/client.c
blob: 45a3c39429a4d84b527a7a6cdaf4398d54faea62 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#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>
#include <sys/types.h>
#include <netdb.h>

int main()
{
	struct addrinfo hints;
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = 0;
	hints.ai_protocol = 0;

	struct addrinfo *result;
	int ret = getaddrinfo("127.0.0.1", "24242", &hints, &result);
	if (ret == -1) {
		err(EXIT_FAILURE, "failed getting addr info");
	}

	int tcp_sock = -1;

	for (struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) {
		int s = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
		if (s == -1)
			continue;

		if (connect(s, rp->ai_addr, rp->ai_addrlen) != -1) {
			tcp_sock = s;
			break;
		}

		close(s);
	}

	freeaddrinfo(result);
	if (tcp_sock == -1) {
		err(EXIT_FAILURE, "couldn't connect to socket");
		return -1;
	}

	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
		}
	};

	while (poll(polls, 2, -1)) {
		if (polls[0].revents) {
			char cb = 'a';

			int ret = read(STDIN_FILENO, &cb, 1);
			if (ret == -1) {
				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);
}