@@ -0,0 +1,150 @@
4+#include <sys/socket.h>
14+// Note: this is not consistent across CPUs (and hence across threads on multicore machines)
17+ gettimeofday(&tp, NULL);
18+ return ((double) tp.tv_sec) * 1e6 + (double) tp.tv_usec;
22+ printf("starting server\n");
24+ struct addrinfo hints, *res;
25+ int error, server_socket;
27+ memset(&hints, 0, sizeof(hints));
28+ hints.ai_family = PF_INET;
29+ hints.ai_socktype = SOCK_STREAM;
30+ hints.ai_flags = AI_PASSIVE;
32+ error = getaddrinfo(NULL, "8080", &hints, &res);
34+ printf("server error: %s\n", gai_strerror(error));
38+ server_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
39+ if(server_socket < 0) {
40+ printf("server error: could not create socket\n");
45+ if(setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
46+ printf("server error: could not set socket options\n");
50+ if(bind(server_socket, res->ai_addr, res->ai_addrlen) < 0) {
51+ printf("server error: could not bind to socket\n");
55+ listen(server_socket, 5);
58+ struct sockaddr_storage client_addr;
60+ client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
63+ char* buf = malloc(8);
64+ ssize_t read = recv(client_socket, buf, 8, 0);
69+ // printf("server received '%s'\n", buf);
70+ send(client_socket, buf, 8, 0);
78+int client(int pings) {
79+ printf("starting client\n");
81+ struct addrinfo hints, *res;
82+ int error, client_socket;
84+ memset(&hints, 0, sizeof(hints));
85+ hints.ai_family = PF_INET;
86+ hints.ai_socktype = SOCK_STREAM;
88+ error = getaddrinfo("127.0.0.1", "8080", &hints, &res);
90+ printf("client error: %s\n", gai_strerror(error));
94+ client_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
95+ if(client_socket < 0) {
96+ printf("client error: could not create socket\n");
100+ if(connect(client_socket, res->ai_addr, res->ai_addrlen) < 0) {
101+ printf("client error: could not connect: %s\n", strerror(errno));
105+ for(int i = 0; i < pings; i++) {
106+ double timestamp_before = timestamp();
108+ send(client_socket, "ping123", 8, 0);
110+ char *buf = malloc(8);
111+ ssize_t read = recv(client_socket, buf, 8, 0);
114+ printf("server exited prematurely\n");
119+ // printf("client received '%s'\n", buf);
122+ double timestamp_after = timestamp();
123+ fprintf(stderr, "%i %lf\n", i, timestamp_after - timestamp_before);
126+ printf("client did %d pings\n", pings);
132+int usage(int argc, char** argv) {
133+ printf("usage: %s <number of pings>\n", argv[0]);
137+int main(int argc, char** argv) {
139+ return usage(argc, argv);
143+ // TODO: we should wait until we know the server is ready
145+ sscanf(argv[1], "%d", &pings);
146+ return client(pings);