git.iko.soy/distributed-process
on master help sign in
C version of the ping test
commitee77eeb8c4d053abb39ed8c3900f7d670175a32d authorEdsko de Vries <edsko@well-typed.com> dateTue 10 Apr 2012, 16:08 (15 years ago) parent555b2c1
1 file changed+122
benchmarks/pingtest.c+122
benchmarks/pingtest.cnew file+122
@@ -0,0 +1,122 @@
1+#include <stdio.h>
2+#include <stdlib.h>
3+#include <sys/types.h>
4+#include <sys/socket.h>
5+#include <netdb.h>
6+#include <string.h>
7+#include <unistd.h>
8+#include <signal.h>
9+#include <errno.h>
10+
11+int server(int pings) {
12+ struct addrinfo hints, *res;
13+ int error, server_socket;
14+
15+ memset(&hints, 0, sizeof(hints));
16+ hints.ai_family = PF_INET;
17+ hints.ai_socktype = SOCK_STREAM;
18+ hints.ai_flags = AI_PASSIVE;
19+
20+ error = getaddrinfo(NULL, "8080", &hints, &res);
21+ if(error) {
22+ printf("server error: %s\n", gai_strerror(error));
23+ return -1;
24+ }
25+
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");
29+ return -1;
30+ }
31+
32+ int yes = 1;
33+ if(setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) < 0) {
34+ printf("server error: could not set socket options\n");
35+ return -1;
36+ }
37+
38+ if(bind(server_socket, res->ai_addr, res->ai_addrlen) < 0) {
39+ printf("server error: could not bind to socket\n");
40+ return -1;
41+ }
42+
43+ listen(server_socket, 5);
44+
45+ int client_socket;
46+ struct sockaddr_storage client_addr;
47+ socklen_t addr_size;
48+ client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
49+
50+ for(int i = 0; i < pings; i++) {
51+ char buf[8];
52+ ssize_t read = recv(client_socket, &buf, 8, 0);
53+ // printf("server received '%s'\n", buf);
54+ send(client_socket, buf, 8, 0);
55+ }
56+
57+ freeaddrinfo(res);
58+ return 0;
59+}
60+
61+int client(int pings) {
62+ printf("starting client\n");
63+
64+ struct addrinfo hints, *res;
65+ int error, client_socket;
66+
67+ memset(&hints, 0, sizeof(hints));
68+ hints.ai_family = PF_INET;
69+ hints.ai_socktype = SOCK_STREAM;
70+
71+ error = getaddrinfo("127.0.0.1", "8080", &hints, &res);
72+ if(error) {
73+ printf("client error: %s\n", gai_strerror(error));
74+ return -1;
75+ }
76+
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");
80+ return -1;
81+ }
82+
83+ if(connect(client_socket, res->ai_addr, res->ai_addrlen) < 0) {
84+ printf("client error: could not connect: %s\n", strerror(errno));
85+ return -1;
86+ }
87+
88+ for(int i = 0; i < pings; i++) {
89+ send(client_socket, "ping123", 8, 0);
90+
91+ char buf[8];
92+ ssize_t read = recv(client_socket, &buf, 8, 0);
93+ // printf("client received '%s'\n", buf);
94+ }
95+
96+ printf("pinged %d times\n", pings);
97+
98+ freeaddrinfo(res);
99+ return 0;
100+}
101+
102+int usage(int argc, char** argv) {
103+ printf("usage: %s (server | client) <number of pings>\n", argv[0]);
104+ return -1;
105+}
106+
107+int main(int argc, char** argv) {
108+ if(argc != 3) {
109+ return usage(argc, argv);
110+ }
111+
112+ int pings = 0;
113+ sscanf(argv[2], "%d", &pings);
114+
115+ if(!strcmp(argv[1], "server")) {
116+ return server(pings);
117+ } else if(!strcmp(argv[1], "client")) {
118+ return client(pings);
119+ } else {
120+ return usage(argc, argv);
121+ }
122+}