1e5b59efd73ea07a3aad31e4d7d667a97c1afd1b
[p2p-kernel-protocol.git] / sendfile / client / client.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <sys/sendfile.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <fcntl.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <netdb.h>
12
13 #define MAX_NUMBER_OF_PEERS             256
14 #define CHUNK_SIZE                      256
15
16 int main(int argc, char **argv) {
17         int sock, err;
18         struct sockaddr_in psin;
19         struct hostent *host;
20         char *file_name;
21         int fd[MAX_NUMBER_OF_PEERS];
22         int peers[MAX_NUMBER_OF_PEERS];
23         int i = 0, total, sent_size;
24
25         if (argc < 4 || argc % 2) {
26                 printf("Usage: %s <file_name> <peer_ip1> <peer_port1> <peer_ip2>"
27                                 " <peer_port2> ...\n", argv[0]);
28                 return -1;
29         }
30
31         printf("Create sendfile socket\n");
32
33         sock = socket(AF_INET, SOCK_DGRAM, 0);
34         printf("Socket returned: %d\n", sock);
35
36         if (sock < 0) {
37                 printf("Cannot create sendfile socket: %s(%d)\n", 
38                                 strerror(errno), errno);
39                 return -1;
40         }
41         printf("Succesfully created sendfile socket\n");
42
43         argv++;
44         file_name = argv[0];
45         argv++;
46
47         while(*argv) {
48                 printf("Create sendfile socket\n");
49
50                 sock = socket(AF_INET, SOCK_DGRAM, 0);
51                   printf("Socket returned: %d\n", sock);
52
53                 if (sock < 0) {
54                         printf("Cannot create sendfile socket: %s(%d)\n", 
55                                         strerror(errno), errno);
56                         return -1;
57                 }
58                 printf("Succesfully created sendfile socket\n");
59
60                 printf("Connecting to: %s:%s\n", argv[0], argv[1]);
61                 host = gethostbyname(argv[0]);
62                 psin.sin_family = AF_INET;
63                 psin.sin_port = htons(atoi(argv[1]));
64                 psin.sin_addr = *((struct in_addr*)host->h_addr);
65
66                 if (connect(sock, (struct sockaddr *)&psin, 
67                                         sizeof(struct sockaddr_in)) == -1) {
68                         printf("Cannot connect to server: %s(%d)\n", 
69                                         strerror(errno), errno);
70                         continue;
71                 }
72                 printf("Connected to: %s:%s\n", argv[0], argv[1]);
73                 peers[i] = sock;
74                 fd[i] = open(file_name, O_RDONLY);
75                 if (fd[i++] < 0) {
76                         printf("Opening file error: %s(%d)\n", strerror(errno), errno);
77                         i--;
78                 }
79         }
80
81         total = i;
82
83         do {
84                 sent_size = 0;
85
86                 for (i = 0; i < total; i++) {
87                         if ((err = sendfile(fd[i], peers[i], NULL, CHUNK_SIZE)) < 0) {
88                                 printf("Sending file error: %s(%d)\n", strerror(errno), errno);
89                         } else {
90                                 sent_size += err;
91                         }
92                 }
93         } while(sent_size);
94
95         return 0;
96 }