+ Reply to Thread
Results 1 to 8 of 8

Thread: Porogramování FTP server - client

  1. #1
    Guest

    Porogramování FTP server - client

    zdravim lidicky
    mam problem s programovanim aplikace pro prenos souboru po siti ... ftp klient server prez UDP protokol ... teorii o socketech a tak znam ale implementace v C mi dela problem
    nemate s tim nekdo zkusenosti a nebo dokonce nejakou takovou aplikaci hotovou?
    diky za pomoc

  2. #2

    Re: Porogramování FTP server - client

    Náhodou skúsenosti mám. Aj aplikácia by sa našla, aj keď to nie je FTP, ale len také primitívne nahrávanie a sťahovanie súborov po sieti, ktoré nerieši viaceré veci. Ale ak napíšeš čo ťa bolí a prípadne sem hodíš kód ktorý ti robí problémy tak by nemal byť problém
    Všetci chcú vaše dobro. Nedajte si ho vziať!!

  3. #3
    Guest

    Re: Porogramování FTP server - client

    no ja ted prisel na to jak poslat po siti datovy typ struktura za pomoci UDP socketu ... ted mi jde o to, ze musim na strane serveru porovnat login a heslo v souboru coz taky zvladnu ale na zaklade toho musim rozpoznavat proces pro daneho uzivatele kdyz mi budou chodit jeho prikazy a kdyz se pripoji novy klient tak pomoci fork vyvolat pro nej dalsi proces...nevim cim a jak bych mel identifikovat klienty aby se vykonavaly prikazy pro kazdeho zvlast a nezavysle na sobe ...
    jinak pokud bych mohl te pozadat o ty kody poskytnul bys je prosim pro inspiraci prosim ? posilani souboru budu resit az vyresim tuhle vec tak by bylo dobre mit inspiraci vis jak pokud budes souhlasit tak muj email : kloobasa@seznam.cz
    uz ted kazdopadne diky za odpoved

  4. #4

    Re: Porogramování FTP server - client

    Noo, tie kódy ti fakt nepomôžu, lebo to bol len taký projekt do školy a nerieši to ani uzamykanie súborov pri operáciách kde je to treba, ani to ak sú klient i server v rovnakom priečinku. A hlavne tam neriešim žiadnych užívateľov ani relácie ako ty. Ďalej je to robené cez vlákna a nie procesy a ako transportný protokol využívam TCP. Proste stiahnem/nahrám súbor a koniec. Takže...kód ti určite nepošlem, lebo nerád dávam na verejnosť kódy zo školy a navyše ti to je na nič, len čo by si tým zabil čas. Ale konkrétne hento sa rieši nasledovne:
    • Pošleš meno a heslo serveru cez UDP na dohodnutý port[/*:m:8t5afa7b]
    • Server vyhodnotí autentifikáciu a odošle či si prihlásený alebo nie[/*:m:8t5afa7b]
    • Ak nie si prihlásený tak koniec alebo skúsiš znovu meno a heslo[/*:m:8t5afa7b]
    • Ak ťa to prihlási tak server vytvorí nový proces a otvorí nový socket na nejakom náhodnom platnom porte[/*:m:8t5afa7b]
    • Odošle klientovi nejaký paket s potvrdením o úspechu autentizácie z nového procesu[/*:m:8t5afa7b]
    • Klient zistí IP a PORT procesu z dát prijatých z recvfrom Uloží si nové hodnoty [/*:m:8t5afa7b]
    • Bude komunikovať so serverom pomocou novovytvoreného soketu s novými hodnotami IP a PORT[/*:m:8t5afa7b]
    Takto vlastne zaistíš komunikáciu stále s rovnakým procesom a načúvať budeš stále na rovnakom porte kde sa budú pripájať noví klienti
    Všetci chcú vaše dobro. Nedajte si ho vziať!!

  5. #5
    Guest

    Re: Porogramování FTP server - client

    tak to je potom jasne ze mi nebudou ty kody k nicemu, mas pravdu ... diky pokusim se o toto podle tveho navodu ...
    dale bych se chtel zeptat, zda vis jak na serverovem programku zajistit jednu slozku jakoze root pro FTP ? a nasledne jak vykonavat prikazy v teto slozce/adresari ... jakoze jak implementovat v C prikaz naprikad MKD nazevadresare nebo jakykoli jiny ?
    diky moc za tvuj cas

  6. #6

    Re: Porogramování FTP server - client

    Stačí si pozrieť manuálové stránky. Funkcia mkdir(3p) aj iné ktoré asi budeš potrebovať sú súčasťou POSIX-u, takže na UNIX-like systémoch by nemal byť problém. Ak to potrebuješ mať funkčné aj na Windowsoch tak jedine niečo pogoogli alebo využi nejaký FrameWork alebo si to napíš pomocou podmienenej kompilácie na základe platformy.
    Všetci chcú vaše dobro. Nedajte si ho vziať!!

  7. #7
    Guest

    Re: Porogramování FTP server - client

    tak jsem se snazil a snazil a nejak mi to nejde ... dal jsem sem kody klienta a serveru ... problemy mam nasledujici ... kdyz spoustim programky pres strace -f tak po prihlaseni dostanu ze serveru odpoved Jste prihlasen! opradu na jinem portu i adrese, ale klient vypise pouze informaci Jste prihlasen! a ceka dale na recvfrom coz nechapu.
    dale nevim co s vetvi rodicovskeho procesu ... server na prihlaseni dalsiho klienta nereaguje!
    pokud to budes chtit spustit tak staci zalozit soubor login.txt ... polozky login a password jsou v souboru oddeleny ; a v celem tvaru jsou kontrolovany
    prosim prosim kouknes na to?
    diky moc za pomoc

    Code:
    //cliet
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/un.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <errno.h>
    //#include <glib.h>
    
    int main()
    {
    	int sockfd;
    	int len;
    	struct sockaddr_in address;
    	int result;
    	char ch[100];
            char login[100];
    	char password[25];
    
       struct balik {
               int id_procesu;
    	   int delka;
    	   int poradi;
               char data[1024];
             } packet;
    
    	
    	//printf("login %s", login);
    
    
    
    	sockfd = socket(AF_INET, SOCK_DGRAM, 0 );
    	address.sin_family = AF_INET;
    	address.sin_addr.s_addr = htonl(INADDR_ANY);    //inet_addr( "127.0.0.1" );
    	address.sin_port = htons( 10001 );
    	len=sizeof( address );
    
           // gets(ch);  //scanf("%s", ch);
    	
    
    while (1) 
       {
    
            printf("Zadejte login: "); scanf ("%s", login);
    	printf("Zadejte heslo: "); scanf ("%s", password);
    	strcat(login, ";");
    	strcat(login, password); //slouceni login a hesla se strednikem na kontrolu v souboru na serveru
    
            strcpy(packet.data, login);
            packet.delka = 15;
            packet.id_procesu = 1;
    
        printf( "%s\n", packet.data); 
    
    	if (sendto(sockfd, (struct balik*)&packet , sizeof (packet),0,(struct sockaddr*)&address, len )==-1) // zaslani packetu s login na server
             {
                 printf("chyba odeslani socketu");
             }
    
    	recvfrom( sockfd, (struct balik*)&packet , sizeof (packet),0,(struct sockaddr*)&address, &len );
            printf( "%s\n", packet.data);
    
            if (strcmp(packet.data, "Chybny login nebo heslo!")==0) continue;
              else break; break;
        }          
              
     //while (1) {      
            recvfrom( sockfd, (struct balik*)&packet , sizeof (packet),0,(struct sockaddr*)&address, &len ); close(sockfd);
            printf( "%s\n", packet.data);
            printf( "%i\n", packet.id_procesu);
            printf ("%d\n",strcmp(packet.data, "Jste prihlasen!"));
            
            if (strcmp(packet.data, "Jste prihlasen!")==0)
            {
           strcpy(packet.data, "tady jsem");
           sendto(sockfd, (struct balik*)&packet , sizeof (packet),0,(struct sockaddr*)&address, len );
            }
    
    //}
    
    
    close(sockfd);
    exit(1);
    
    
    
    }
    
    
    //server
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <sys/un.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    
    int main()
    {	
    	FILE *f;
    
             struct balik {
               int id_procesu;
    	   int delka;
    	   int poradi;
               char data[1024];
             } packet;
    
    	
            int idproc;
    	char * pom;
            char * pom1;
            int server_sockfd,server_sockfd1, client_sockfd, n;
    	int server_len, client_len;
    	struct sockaddr_in server_address;
    	struct sockaddr_in client_address;
            struct sockaddr_in server_address1;
    	struct sockaddr_in client_address1;
    
    	server_sockfd = socket( AF_INET, SOCK_DGRAM, 0 );
    	server_address.sin_family = AF_INET;
    	server_address.sin_addr.s_addr = htonl(INADDR_ANY);  
    	server_address.sin_port = htons(10001);
    
    	server_len = sizeof( server_address );
    
    	if( bind( server_sockfd, ( struct sockaddr *)&server_address, server_len ) != 0 )
    	{
    		perror("Bind error!");
                    exit( 1 );
    	}
    
    printf("Server ceka\n" );
    
            printf("%d\n",getpid());
    //while (1)  {
    int x=1;
    while( 1 )
      {
    	 	
    		
    		
    	client_len = sizeof( client_address );
    	n = recvfrom(server_sockfd, (struct balik*)&packet, sizeof(packet), 0, (struct sockaddr*)&client_address, &client_len );
            printf("prdel\n");	printf("%s\n", packet.data);printf("%d\n", packet.delka);printf("%d\n", packet.id_procesu);
    	
    
                    if ((f = fopen("login.txt", "r")) == NULL) 
                      {
                        printf ("Nepodarilo se otevrit soubor login.txt!"); 
                        fclose(f);
    		  }
    		  else 
                       {
                          char log[40];
    	              int c; 
                
                          while ((c = getc(f) != EOF) )
    		       {
                             fscanf(f, "%s", log);
                              //printf("%s\n", log);
             
                             if (strcmp(log,packet.data) ==0 )  
                               { 
                                  
                                 x=0; 
                                 fclose(f); 
                                 printf("%d\n",getpid()); 
                                 break; 
                               }
                               
                            }
    
                             if(x==1)
    		           {
    			     strcpy(packet.data, "Chybny login nebo heslo!");
    			     n = sendto(server_sockfd, (struct balik*)&packet, sizeof(packet), 0, (struct sockaddr*)&client_address, client_len );
    			     continue;
    			   }
    			   else 
                                {
                                 printf( "Pripojil se klient z: \n", inet_ntoa(client_address.sin_addr));
      			     printf("%d\n",x);
                                  
    			     break;
                                }
    			}  
        }
            
                
        
              
                            if (fork()!=0)
                                  {
                                    printf("toto je rodic %d\n",getpid());
                                  }
                                  else
                                   {
         			   server_sockfd1 = socket( AF_INET, SOCK_DGRAM, 0 );
    	                   server_address.sin_family = AF_INET;
    	                   server_address.sin_addr.s_addr = htonl(INADDR_ANY);  
    	                   server_address.sin_port = htons(10002);
                               server_len = sizeof( server_address);
    				client_len = sizeof( client_address );
                             if( bind( server_sockfd1, ( struct sockaddr *)&server_address, server_len ) != 0 )
    	                    {
    		                       perror("Bind error!");
                                            exit( 1 );
    	                           }
         
                                   printf("toto je potomek %d\n",getpid());
    			       strcpy(packet.data, "Jste prihlasen!");
    			       packet.id_procesu = 1;
    			       n = sendto(server_sockfd1, (struct balik*)&packet, sizeof(packet), 0, (struct sockaddr*)&client_address, client_len );
                                   n = recvfrom(server_sockfd1, (struct balik*)&packet, sizeof(packet), 0, (struct sockaddr*)&client_address, &client_len );
    			  printf("%s\n", packet.data);
                                   } 
         
                      
                   
                    
     }

  8. #8

    Re: Porogramování FTP server - client

    No to, že je to aj na inej adrese je divné, keďže program sa v sieti nepresunie. Zmeniť by sa mal len port myslím. Ale, čo sa týka toho programu tak by si si ho mal rozdeliť na funkcie ako napr.:
    • getDataFromUser() - načíta meno a heslo, zobrazí výzvy a vráti výsledok (login, pass)[/*:m:2a4cuhes]
    • loginToFTP() - odošle prihlasovacie údaje[/*:m:2a4cuhes]
    • getLoginResponse() - vráti úspech/neúspech prihlásenia a nové parametre spojenia (port, prípadne IP)[/*:m:2a4cuhes]
    • ...[/*:m:2a4cuhes]
    Je to len návrh. Mal by si si to rozdeliť tak ako ti to vyhovuje aby sa ti dobre pracovalo. Inak, momentálne nemám čas ladiť cudzie veci, lebo sám mám toho veľa
    Všetci chcú vaše dobro. Nedajte si ho vziať!!

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts