@@ -0,0 +1,122 @@
4+#include <sys/socket.h>
11+int server(int pings) {
12+ struct addrinfo hints, *res;
13+ int error, server_socket;
15+ memset(&hints, 0, sizeof(hints));
16+ hints.ai_family = PF_INET;
17+ hints.ai_socktype = SOCK_STREAM;
18+ hints.ai_flags = AI_PASSIVE;
20+ error = getaddrinfo(NULL, "8080", &hints, &res);
22+ printf("server error: %s\n", gai_strerror(error));
26+ server_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
27+ if(server_socket < 0) {
28+ printf("server error: could not create socket\n");
33+ if(setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
34+ printf("server error: could not set socket options\n");
38+ if(bind(server_socket, res->ai_addr, res->ai_addrlen) < 0) {
39+ printf("server error: could not bind to socket\n");
43+ listen(server_socket, 5);
46+ struct sockaddr_storage client_addr;
48+ client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
50+ for(int i = 0; i < pings; i++) {
52+ ssize_t read = recv(client_socket, &buf, 8, 0);
53+ // printf("server received '%s'\n", buf);
54+ send(client_socket, buf, 8, 0);
61+int client(int pings) {
62+ printf("starting client\n");
64+ struct addrinfo hints, *res;
65+ int error, client_socket;
67+ memset(&hints, 0, sizeof(hints));
68+ hints.ai_family = PF_INET;
69+ hints.ai_socktype = SOCK_STREAM;
71+ error = getaddrinfo("127.0.0.1", "8080", &hints, &res);
73+ printf("client error: %s\n", gai_strerror(error));
77+ client_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
78+ if(client_socket < 0) {
79+ printf("client error: could not create socket\n");
83+ if(connect(client_socket, res->ai_addr, res->ai_addrlen) < 0) {
84+ printf("client error: could not connect: %s\n", strerror(errno));
88+ for(int i = 0; i < pings; i++) {
89+ send(client_socket, "ping123", 8, 0);
92+ ssize_t read = recv(client_socket, &buf, 8, 0);
93+ // printf("client received '%s'\n", buf);
96+ printf("pinged %d times\n", pings);
102+int usage(int argc, char** argv) {
103+ printf("usage: %s (server | client) <number of pings>\n", argv[0]);
107+int main(int argc, char** argv) {
109+ return usage(argc, argv);
113+ sscanf(argv[2], "%d", &pings);
115+ if(!strcmp(argv[1], "server")) {
116+ return server(pings);
117+ } else if(!strcmp(argv[1], "client")) {
118+ return client(pings);
120+ return usage(argc, argv);