1+ #include <stdio.h>
2+ #include <string.h>
3+ #include <sys/stat.h>
4+ #include <sys/types.h>
5+ #include <sys/socket.h>
6+ #include <netinet/in.h>
7+ #include <arpa/inet.h>
8+ #include <sys/sendfile.h>
9+ #include <stdlib.h>
10+ /*for O_RDONLY*/
11+ #include <fcntl.h>
12+ int main ()
13+ {
14+ struct sockaddr_in client , server ;
15+ struct stat obj ;
16+ int lfd , n , confd , k , size , filehandle ;
17+ char rbuf [100 ] = "" , sBuf [100 ] = "" , filename [20 ], command [5 ];
18+ lfd = socket (AF_INET , SOCK_STREAM , 0 );
19+
20+ server .sin_family = AF_INET ;
21+ server .sin_port = 3500 ;
22+ // server.sin_addr.s_addr=inet_addr("127.0.0.1");
23+ server .sin_addr .s_addr = inet_addr ("127.0.0.1" );
24+
25+ k = bind (lfd , (struct sockaddr * )& server , sizeof server );
26+ if (k == -1 )
27+ {
28+ printf ("Binding error" );
29+ exit (1 );
30+ }
31+ k = listen (lfd , 1 );
32+ if (k == -1 )
33+ {
34+ printf ("Listen failed" );
35+ exit (1 );
36+ }
37+
38+ printf ("\nServer ready,waiting for client...." );
39+ n = sizeof client ;
40+ confd = accept (lfd , (struct sockaddr * )& client , & n );
41+
42+ int i = 1 ;
43+ while (1 )
44+ {
45+ recv (confd , rbuf , sizeof rbuf , 0 );
46+ sscanf (rbuf , "%s" , command );
47+ if (!strcmp (command , "get" ))
48+ {
49+ sscanf (rbuf , "%s%s" , filename , filename );
50+ stat (filename , & obj );
51+ filehandle = open (filename , O_RDONLY );
52+ size = obj .st_size ;
53+ if (filehandle == -1 )
54+ size = 0 ;
55+ send (confd , & size , sizeof (int ), 0 );
56+ if (size )
57+ sendfile (confd , filehandle , NULL , size );
58+ }
59+ else if (!strcmp (command , "bye" ) || !strcmp (command , "quit" ))
60+ {
61+ printf ("FTP server quitting..\n" );
62+ i = 1 ;
63+ send (confd , & i , sizeof (int ), 0 );
64+ close (confd );
65+ close (lfd );
66+ exit (0 );
67+ }
68+ }
69+ return 0 ;
70+ }
0 commit comments