2
measure latency of unix domain sockets
3
tridge@samba.org July 2006
12
#include <sys/ioctl.h>
13
#include <sys/types.h>
14
#include <sys/socket.h>
22
static struct timeval tp1,tp2;
24
static void start_timer()
26
gettimeofday(&tp1,NULL);
29
static double end_timer()
31
gettimeofday(&tp2,NULL);
32
return (tp2.tv_sec + (tp2.tv_usec*1.0e-6)) -
33
(tp1.tv_sec + (tp1.tv_usec*1.0e-6));
36
static void fatal(const char *why)
38
fprintf(stderr, "fatal: %s - %s\n", why, strerror(errno));
43
connect to a unix domain socket
45
int ux_socket_connect(const char *name)
48
struct sockaddr_un addr;
50
memset(&addr, 0, sizeof(addr));
51
addr.sun_family = AF_UNIX;
52
strncpy(addr.sun_path, name, sizeof(addr.sun_path));
54
fd = socket(AF_UNIX, SOCK_STREAM, 0);
59
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
69
create a unix domain socket and bind it
70
return a file descriptor open on the socket
72
static int ux_socket_bind(const char *name)
75
struct sockaddr_un addr;
77
/* get rid of any old socket */
80
fd = socket(AF_UNIX, SOCK_STREAM, 0);
81
if (fd == -1) return -1;
83
memset(&addr, 0, sizeof(addr));
84
addr.sun_family = AF_UNIX;
85
strncpy(addr.sun_path, name, sizeof(addr.sun_path));
87
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
98
accept on a unix socket
100
static int ux_socket_accept(int fd)
104
return accept(fd, &a, &len);
107
static void worker(const char *n1, const char *n2, int w)
109
int l = ux_socket_bind(n1);
115
s2 = ux_socket_connect(n2);
116
s1 = ux_socket_accept(l);
121
if (write(s2, &c, 1) != 1) {
124
if (read(s1, &c, 1) != 1) {
127
if (w == 1 && (end_timer() > 1.0)) {
128
printf("%8u ops/sec\r",
129
(unsigned)(2*count/end_timer()));
138
int main(int argc, char *argv[])
141
worker("sock2.unx", "sock1.unx", 0);
143
worker("sock1.unx", "sock2.unx", 1);