[PATCH] splice-bench: set SO_REUSEADDR on server end
[splice.git] / splice-test4s.c
CommitLineData
d8525fbd
JA
1#include <errno.h>
2#include <fcntl.h>
3#include <netinet/in.h>
4#include <signal.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <sys/sendfile.h>
8#include <sys/socket.h>
9#include <sys/time.h>
10#include <sys/types.h>
11#include <unistd.h>
12
13static int error(const char *n)
14{
15 perror(n);
16 return -1;
17}
18
19static int parent(int listen_sk)
20{
21 unsigned long received;
22 struct sockaddr addr;
23 unsigned int len = sizeof(addr);
24 int sk;
25
26again:
27 sk = accept(listen_sk, &addr, &len);
28 if (sk < 0)
29 return error("accept");
30
31 /* read forever */
32 received = 0;
33 for (;;) {
34 int ret = recv(sk, NULL, 128*1024*1024, MSG_TRUNC);
35 if (ret > 0) {
36 received += ret;
37 continue;
38 }
39 if (!ret)
40 break;
41 if (errno == EAGAIN || errno == EINTR)
42 continue;
43 break;
44 }
45
46 printf("Received %f MB of data\n", (double) received / (1024*1024));
47 close(sk);
48 goto again;
49}
50
51int main(int argc, char **argv)
52{
53 unsigned int sk, len;
54 struct sockaddr addr;
55 struct sockaddr_in saddr_in;
56
57 signal(SIGCHLD, SIG_IGN);
58 sk = socket(PF_INET, SOCK_STREAM, 0);
59 if (sk < 0) {
60 perror("socket");
61 exit(1);
62 }
63 saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
64 saddr_in.sin_port = htons(1111);
65
66 if (bind(sk, (struct sockaddr*)&saddr_in, sizeof(saddr_in)) < 0) {
67 fprintf(stderr,"bind failed\n");
68 exit(1);
69 }
70
71 if (listen(sk, 1) < 0) {
72 perror("listen");
73 exit(1);
74 }
75 len = sizeof(addr);
76 if (getsockname(sk, &addr, &len) < 0) {
77 perror("getsockname");
78 exit(1);
79 }
80 return parent(sk);
81}