Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _GNU_SOURCE
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/stat.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <dirent.h>
- #include <errno.h>
- #define BUF 1024
- #define PORT 6543
- int main (int argc, char **argv) {
- mode_t mode = S_IRWXU;
- int create_socket, new_socket;
- socklen_t addrlen;
- char buffer[BUF];
- //char buffer1[] = "Dateiname:";
- int size;
- int err = 0;
- struct sockaddr_in address, cliaddress;
- //struct fuer Verzeichnis einlesen (scandir)
- int num_entries, i;
- int strsize;
- struct dirent /**namelist,*/ **list;
- const char *ptr = NULL;
- char wd[BUF];
- //fuer GET
- //FILE *from, *to;
- //Eingabe der Argumente ServerIP & Port
- if( argc < 3){
- printf("Usage: %s Port Downloadverzeichnis\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- //Verzeichnis anlegen
- //Zugriffsrechte erlauben
- umask(0);
- if((mkdir(argv[2], mode)) != -1 )
- {
- printf("Verzeichnis %s erstellt\n",argv[2]);
- }
- else
- {
- printf("Verzechnis %s schon vorhanden\n",argv[2]);
- }
- create_socket = socket (AF_INET, SOCK_STREAM, 0);
- memset(&address,0,sizeof(address));
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;strcpy(buffer,"OK");
- address.sin_port = htons (PORT);
- if (bind ( create_socket, (struct sockaddr *) &address, sizeof (address)) != 0) {
- perror("bind error");
- return EXIT_FAILURE;
- }
- listen (create_socket, 5);
- addrlen = sizeof (struct sockaddr_in);
- while (1) {
- printf("Waiting for connections...\n");
- new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen );
- if (new_socket > 0)
- {
- printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port));
- strcpy(buffer,"Welcome to myserver, Please enter your command:\n");
- send(new_socket, buffer, strlen(buffer),0);
- }
- //Befehlsabarbeitungen bis Quit ausgefüird.
- do {
- //Befehl von Client erhalten
- size = recv (new_socket, buffer, BUF-1, 0);
- if( size > 0)
- {
- buffer[size] = '\0';
- if(strncmp(buffer, "LIST",4) == 0)
- {
- printf ("Message received: %s\n", buffer);
- ptr = argv[2];
- if((num_entries = scandir(ptr, &list, 0, alphasort)) < 0)
- {
- fprintf (stderr, "Unerwarteter Fehler\n");
- exit (EXIT_FAILURE);
- }
- chdir(ptr);
- getcwd (wd, BUF);
- printf("%d Dateien im Verzeichnis: %s\n", num_entries, wd);
- send(new_socket, &num_entries, sizeof(num_entries), 0);
- if(num_entries > 0 )
- {
- for(i = num_entries; i; --i)
- {
- buffer[0] = '\0';
- sprintf(buffer, "%s\n", list[i-1]->d_name);
- printf(buffer);
- strsize = strlen(buffer);
- send(new_socket, &strsize, sizeof(strsize), 0);
- send(new_socket, buffer, strlen(buffer),0);
- free(list[i-1]);
- }
- free(list);
- }
- else { err++; }
- printf("\n");
- //ok falls kein Fehler besteht
- if(err==0)
- {
- strcpy(buffer,"OK");
- send(new_socket, buffer, strlen(buffer),0);
- }
- else
- {
- strcpy(buffer,"ERROR");
- send(new_socket, buffer, strlen(buffer),0);
- }
- }
- else if(strncmp(buffer, "GET",3) == 0)
- {
- printf ("Message received: %s\n", buffer);
- }
- }
- else if (size == 0)
- {
- printf("Client closed remote socket\n");
- break;
- }
- else
- {
- perror("recv error");
- return EXIT_FAILURE;
- }
- } while (strncmp (buffer, "QUIT", 4) != 0);
- close (new_socket);
- }
- close (create_socket);
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment