Guest User

server.c

a guest
Jan 5th, 2011
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.30 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <sys/stat.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <dirent.h>
  12. #include <errno.h>
  13. #define BUF 1024
  14. #define PORT 6543
  15.  
  16. int main (int argc, char **argv) {
  17.   mode_t mode = S_IRWXU;
  18.   int create_socket, new_socket;
  19.   socklen_t addrlen;
  20.   char buffer[BUF];
  21.   //char buffer1[] = "Dateiname:";
  22.   int size;
  23.   int err = 0;
  24.   struct sockaddr_in address, cliaddress;
  25.   //struct fuer Verzeichnis einlesen (scandir)
  26.   int num_entries, i;
  27.   int strsize;
  28.   struct dirent /**namelist,*/ **list;
  29.   const char *ptr = NULL;
  30.   char wd[BUF];
  31.   //fuer GET
  32.   //FILE *from, *to;
  33.  
  34.   //Eingabe der Argumente ServerIP & Port
  35.   if( argc < 3){
  36.              printf("Usage: %s Port Downloadverzeichnis\n", argv[0]);
  37.              exit(EXIT_FAILURE);
  38.       }
  39.   //Verzeichnis anlegen
  40.   //Zugriffsrechte erlauben
  41.   umask(0);
  42.  
  43.   if((mkdir(argv[2], mode)) != -1 )
  44.   {
  45.       printf("Verzeichnis %s erstellt\n",argv[2]);
  46.  
  47.   }
  48.   else
  49.   {
  50.       printf("Verzechnis %s schon vorhanden\n",argv[2]);
  51.  
  52.   }
  53.  
  54.  
  55.   create_socket = socket (AF_INET, SOCK_STREAM, 0);
  56.  
  57.   memset(&address,0,sizeof(address));
  58.   address.sin_family = AF_INET;
  59.   address.sin_addr.s_addr = INADDR_ANY;strcpy(buffer,"OK");
  60.   address.sin_port = htons (PORT);
  61.  
  62.   if (bind ( create_socket, (struct sockaddr *) &address, sizeof (address)) != 0) {
  63.      perror("bind error");
  64.      return EXIT_FAILURE;
  65.   }
  66.   listen (create_socket, 5);
  67.  
  68.   addrlen = sizeof (struct sockaddr_in);
  69.  
  70.   while (1) {
  71.      printf("Waiting for connections...\n");
  72.      new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen );
  73.      if (new_socket > 0)
  74.      {
  75.         printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port));
  76.         strcpy(buffer,"Welcome to myserver, Please enter your command:\n");
  77.         send(new_socket, buffer, strlen(buffer),0);
  78.      }
  79.      //Befehlsabarbeitungen bis Quit ausgefüird.
  80.      do {
  81.     //Befehl von Client erhalten
  82.         size = recv (new_socket, buffer, BUF-1, 0);
  83.         if( size > 0)
  84.         {
  85.              buffer[size] = '\0';
  86.  
  87.         if(strncmp(buffer, "LIST",4) == 0)
  88.         {
  89.  
  90.                 printf ("Message received: %s\n", buffer);
  91.                 ptr = argv[2];
  92.                 if((num_entries = scandir(ptr, &list, 0, alphasort)) < 0)
  93.                 {
  94.                     fprintf (stderr, "Unerwarteter Fehler\n");
  95.                     exit (EXIT_FAILURE);
  96.                 }
  97.  
  98.                 chdir(ptr);
  99.                 getcwd (wd, BUF);
  100.                 printf("%d Dateien im Verzeichnis: %s\n", num_entries, wd);
  101.                 send(new_socket, &num_entries, sizeof(num_entries), 0);
  102.                 if(num_entries > 0 )
  103.                 {
  104.                     for(i = num_entries; i; --i)
  105.                     {
  106.                         buffer[0] = '\0';
  107.                         sprintf(buffer, "%s\n", list[i-1]->d_name);
  108.                         printf(buffer);
  109.                         strsize = strlen(buffer);
  110.                         send(new_socket, &strsize, sizeof(strsize), 0);
  111.                         send(new_socket, buffer, strlen(buffer),0);
  112.                         free(list[i-1]);
  113.                     }
  114.                     free(list);
  115.                 }
  116.                 else { err++; }
  117.                 printf("\n");
  118.  
  119.  
  120.             //ok falls kein Fehler besteht
  121.             if(err==0)
  122.             {
  123.                 strcpy(buffer,"OK");
  124.                 send(new_socket, buffer, strlen(buffer),0);
  125.             }
  126.             else
  127.             {
  128.                 strcpy(buffer,"ERROR");
  129.                 send(new_socket, buffer, strlen(buffer),0);
  130.             }
  131.         }
  132.         else if(strncmp(buffer, "GET",3) == 0)
  133.         {
  134.             printf ("Message received: %s\n", buffer);
  135.  
  136.  
  137.         }
  138.  
  139.  
  140.         }
  141.         else if (size == 0)
  142.         {
  143.            printf("Client closed remote socket\n");
  144.            break;
  145.         }
  146.         else
  147.         {
  148.            perror("recv error");
  149.            return EXIT_FAILURE;
  150.         }
  151.      } while (strncmp (buffer, "QUIT", 4)  != 0);
  152.      close (new_socket);
  153.   }
  154.   close (create_socket);
  155.   return EXIT_SUCCESS;
  156. }
Advertisement
Add Comment
Please, Sign In to add comment