Commit | Line | Data |
---|---|---|
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 | ||
13 | static int error(const char *n) | |
14 | { | |
15 | perror(n); | |
16 | return -1; | |
17 | } | |
18 | ||
19 | static int parent(int listen_sk) | |
20 | { | |
21 | unsigned long received; | |
22 | struct sockaddr addr; | |
23 | unsigned int len = sizeof(addr); | |
24 | int sk; | |
25 | ||
26 | again: | |
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 | ||
000b72a8 | 51 | int main(__attribute__((__unused__)) int argc, __attribute__((__unused__)) char **argv) |
d8525fbd | 52 | { |
d8525fbd | 53 | struct sockaddr_in saddr_in; |
000b72a8 JA |
54 | struct sockaddr addr; |
55 | unsigned int len; | |
56 | int sk; | |
d8525fbd JA |
57 | |
58 | signal(SIGCHLD, SIG_IGN); | |
59 | sk = socket(PF_INET, SOCK_STREAM, 0); | |
60 | if (sk < 0) { | |
61 | perror("socket"); | |
62 | exit(1); | |
63 | } | |
64 | saddr_in.sin_addr.s_addr = htonl(INADDR_ANY); | |
65 | saddr_in.sin_port = htons(1111); | |
66 | ||
67 | if (bind(sk, (struct sockaddr*)&saddr_in, sizeof(saddr_in)) < 0) { | |
68 | fprintf(stderr,"bind failed\n"); | |
69 | exit(1); | |
70 | } | |
71 | ||
72 | if (listen(sk, 1) < 0) { | |
73 | perror("listen"); | |
74 | exit(1); | |
75 | } | |
76 | len = sizeof(addr); | |
77 | if (getsockname(sk, &addr, &len) < 0) { | |
78 | perror("getsockname"); | |
79 | exit(1); | |
80 | } | |
81 | return parent(sk); | |
82 | } |