8bc0ff0b321845bcfd859a075f501dd09cf59dbf
[p2p-kernel-protocol.git] / sendfile / server / server.c
1 #include <netinet/in.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <fcntl.h>
7 #include <errno.h>
8 #include <netdb.h>
9 #include <stdio.h>
10
11 #define BUFFER_SIZE             256
12
13 int main(int argc, char **argv)
14 {
15         int sock, err, file_fd;
16         ssize_t ret, len, offset, bytes_to_write;
17         struct sockaddr_in psin;
18         struct hostent *host;
19         char buffer[BUFFER_SIZE];
20
21         if (argc != 4) {
22                 fprintf(stderr, "Usage: %s <peer_ip> <peer_port> <file_name>\n", argv[0]);
23                 return -1;
24         }
25
26         printf("Opening AF_INET socket\n");
27
28         /* first open the file descriptor */
29         file_fd = open(argv[3], O_CREAT|O_WRONLY|O_TRUNC, 0644);
30         if (file_fd < 0) {
31                 printf("Cannot open file for write\n");
32                 return -1;
33         }
34         printf("Opened file for write %s[%d]\n", argv[3], file_fd);
35
36         sock = socket(AF_INET, SOCK_DGRAM, 0);
37         printf("Socket returned: %d\n", sock);
38
39         if (sock < 0) {
40                 printf("Cannot create AF_INET socket: %s(%d)\n",
41                                 strerror(errno), errno);
42                 return -1;
43         }
44         printf("Successfully created AF_INET socket: %d\n", sock);
45
46         host = gethostbyname(argv[1]);
47         psin.sin_family = AF_INET;
48         psin.sin_port = htons(atoi(argv[2]));
49         psin.sin_addr = *((struct in_addr *)host->h_addr);
50
51         if (bind(sock, (struct sockaddr *)&psin,
52                                 sizeof(struct sockaddr_in)) == -1) {
53                 printf("Cannot bind to server: %s(%d)\n", strerror(errno), errno);
54                 return -1;
55         }
56
57         printf("Bound to: %s:%s\n", argv[1], argv[2]);
58         
59         for (;;) {
60                 ret = read(sock, buffer, BUFFER_SIZE);
61                 if (ret < 0) {
62                         printf("Error while receiving file %s: %s(%d)\n", argv[0],
63                                         strerror(errno), errno);
64                         return err;
65                 } else if (ret == 0) {
66                         break;
67                 }
68                 bytes_to_write = ret;
69                 offset = 0;
70                 do {
71                         len = write(file_fd, buffer+offset, bytes_to_write);
72                         if (len < 0) {
73                                 printf("Error while receiving file %s: %s(%d)\n", argv[0],
74                                                 strerror(errno), errno);
75                                 return -1;
76                         }
77                         bytes_to_write -= len;
78                         offset += len;
79                 } while (bytes_to_write > 0);
80                 if (ret < BUFFER_SIZE)
81                         break;
82         }
83
84         printf("Successfully read file %s\n", argv[0]);
85
86         return 0;
87 }