Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Server con immissione password
Forum - C/C++ - Server con immissione password

Avatar
Zimo (Normal User)
Newbie


Messaggi: 10
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 22:42
Sabato, 15/08/2009
Eccomi, dato che mi sono iscritto da poco dovevo subito postare qualcosa no?:)
Ho creato questo sorgente, esso appena riceve una connessione manda al client "Salve" e poi chiede di immettere un passowrd e se si sbaglia si chiude la connessione(avviene anche se si indovina, però volevo provare a vedere se funzionava).
Lo compilo, non mi da errori, però quando lo avvio sulla finestra compaio all infinito tutti caratteri.Mi sapreste aiutare a capire cosa sbaglio o a migliorare il sorgente?
Codice sorgente - presumibilmente C/C++

  1. #include<windows.h>
  2. #include<winsock2.h>
  3. #include<stdio.h>
  4.  
  5. int main(void){
  6. SOCKET sockfd, new_sockfd;
  7. WSADATA data;
  8. struct sockaddr_in host_addr, client_addr;
  9. WORD p;
  10. int sin_size;
  11. p = MAKEWORD(2,0);
  12. WSAStartup(p, &data);
  13. if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
  14.         printf("Errore inizializzazzione socket");
  15.  
  16. host_addr.sin_family= PF_INET;
  17. host_addr.sin_port=htons(7890);
  18. host_addr.sin_addr.s_addr= 0;
  19.  
  20. if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
  21.         printf("Errore collegamento socket porta");
  22.  
  23. if(listen(sockfd, 1) == -1)
  24.         printf("Errore coda client");
  25.  
  26. while(1){
  27. sin_size = sizeof(struct sockaddr);
  28. new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
  29. if(new_sockfd == -1)
  30.         printf("Errore accettazione connessione!");
  31.  
  32. printf("ih");
  33.  
  34. send(new_sockfd, "Salve", 6, 0);
  35. if(send(new_sockfd, "Immettere password: ", 20, 0) == "camera"){
  36. send(new_sockfd, "Esatto", 7, 0);
  37. closesocket(new_sockfd);
  38. } else {
  39. send(new_sockfd, "Errore", 8, 0);
  40. closesocket(new_sockfd);
  41. }
  42. closesocket(new_sockfd);
  43. }
  44. WSACleanup();
  45. return 0;
  46. }


Ultima modifica effettuata da Zimo il 15/08/2009 alle 22:44
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 2:13
Domenica, 16/08/2009
In che senso "appaiono tutti i caratteri"?


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
Zimo (Normal User)
Newbie


Messaggi: 10
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 9:43
Domenica, 16/08/2009
Mi compare all infinito la scritta errore accettazione connessione.
Quando avevo creato in passato un semplice server del genere riuscivo a connettermi e a visualizzare quello che volevo, invece qui mi compare direttamente quella scritta all infinito.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 2:25
Lunedì, 17/08/2009
Testo quotato

Postato originariamente da Zimo:

Eccomi, dato che mi sono iscritto da poco dovevo subito postare qualcosa no?:)
Ho creato questo sorgente, esso appena riceve una connessione manda al client "Salve" e poi chiede di immettere un passowrd e se si sbaglia si chiude la connessione(avviene anche se si indovina, però volevo provare a vedere se funzionava).
Lo compilo, non mi da errori, però quando lo avvio sulla finestra compaio all infinito tutti caratteri.Mi sapreste aiutare a capire cosa sbaglio o a migliorare il sorgente?
Codice sorgente - presumibilmente C/C++

  1. #include<windows.h>
  2. #include<winsock2.h>
  3. #include<stdio.h>
  4.  
  5. int main(void){
  6. SOCKET sockfd, new_sockfd;
  7. WSADATA data;
  8. struct sockaddr_in host_addr, client_addr;
  9. WORD p;
  10. int sin_size;
  11. p = MAKEWORD(2,0);
  12. WSAStartup(p, &data);
  13. if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
  14.         printf("Errore inizializzazzione socket");
  15.  
  16. host_addr.sin_family= PF_INET;
  17. host_addr.sin_port=htons(7890);
  18. host_addr.sin_addr.s_addr= 0;
  19.  
  20. if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
  21.         printf("Errore collegamento socket porta");
  22.  
  23. if(listen(sockfd, 1) == -1)
  24.         printf("Errore coda client");
  25.  
  26. while(1){
  27. sin_size = sizeof(struct sockaddr);
  28. new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
  29. if(new_sockfd == -1)
  30.         printf("Errore accettazione connessione!");
  31.  
  32. printf("ih");
  33.  
  34. send(new_sockfd, "Salve", 6, 0);
  35. if(send(new_sockfd, "Immettere password: ", 20, 0) == "camera"){



Questa parte è errata.

La funzione send() restituisce il numero di byte effettivamente inviati, non una stringa.
Inoltre, anche se tu volessi confrontare in C due stringhe, non funzionerebbe mai una cosa del genere:

if (stringa1 == stringa2) { }

per il semplice motivo che in C le stringhe sono trattate come puntatori a carattere e, dal momento che due stringhe diverse risiedono in due locazioni di memoria diverse, il confronto sarà sempre negativo.

semmai dovresti fare una send() con la stringa "Immettere password: ", seguita da una receive() per leggere il messaggio di risposta in un buffer (presumibilmente il client avrà inviato una stringa con la password) e confrontare le due password in questo modo:

if (strcmp(stringa1, stringa2) == 0) {}

La funzione strcmp restituisce -1 se la prima stringa è minore della seconda (in ordine alfabetico), 0 se sono uguali e 1 se la seconda è minore della prima.
Testo quotato


Codice sorgente - presumibilmente C/C++

  1. send(new_sockfd, "Esatto", 7, 0);
  2. closesocket(new_sockfd);
  3. } else {
  4. send(new_sockfd, "Errore", 8, 0);
  5. closesocket(new_sockfd);
  6. }
  7. closesocket(new_sockfd);
  8. }
  9. WSACleanup();
  10. return 0;
  11. }




Puoi leggere questo articolo sul mio sito, è una breve guida pratica all'utilizzo dei socket in ambiente Unix, può esserti utile ;)

http://www.oscene.net/it/programmazione/c/come-programmare ...

Ultima modifica effettuata da TheKaneB il 17/08/2009 alle 2:27


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
Zimo (Normal User)
Newbie


Messaggi: 10
Iscritto: 15/08/2009

Segnala al moderatore
Postato alle 11:47
Lunedì, 17/08/2009
Grazie per le risposte, tutto va bene tranne un punto:
Codice sorgente - presumibilmente C++

  1. #include<windows.h>
  2. #include<winsock.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. #define PORTA 7890
  7.  
  8. int main(void){
  9. SOCKET sockfd, new_sockfd;
  10. WSADATA data;
  11. struct sockaddr_in host_addr, client_addr;
  12. WORD p;
  13. int lun;
  14. char pass[8];
  15. p=MAKEWORD(2,0);
  16. WSAStartup(p, &data);
  17.  
  18. if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
  19.            printf("Errore nel socket");
  20.            
  21. host_addr.sin_family = PF_INET;
  22. host_addr.sin_port = htons(PORTA);
  23. host_addr.sin_addr.s_addr = 0;
  24.  
  25. if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
  26.                 printf("Errore binding");
  27.                
  28. if(listen(sockfd, 5) == -1)
  29.                  printf("Errore listening");
  30.                  
  31. while(1){
  32. lun = sizeof(struct sockaddr);
  33. new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &lun);
  34. if(new_sockfd == -1)
  35.               printf("Errore accettazione connessione");
  36.              
  37. printf("Sono connesso...e in esecuzione\n");
  38.  
  39. send(new_sockfd, "Hello word!\n", 13, 0);
  40. send(new_sockfd, "Immettere password: ", 21, 0); //quando vado a scrivere la password mi fa immettere solo un byte, infatti 21 a solo un byte in più
  41. recv(new_sockfd, pass, 8, 0); //appena immetto un carattere per scrivere la password giusta il client(telnet) esce
  42. if(strcmp(pass, "camera") == 0){
  43. printf("Password giusta\n");
  44. } else {
  45. printf("Password errata\n");
  46. }
  47. closesocket(new_sockfd);
  48. }
  49.  WSACleanup();
  50.  return 0;
  51.  }



Praticamente non mi fa immettere la tutta la password ma solo un byte dopo "Immettere password: ", altrimenti se cambio 21 con 27 mi visualizza direttamente la password e questo non va bene.

Ultima modifica effettuata da Zimo il 17/08/2009 alle 11:49
PM Quote
Avatar
Prezioso (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/10/2009

Segnala al moderatore
Postato alle 17:21
Domenica, 04/10/2009
Ciao ragazzi per puro caso facendo delle ricerche ho trovato questa ottima applicazione! Frequento la facoltà informatica applicata e da poco che abbiamo iniziato lo studio dei socket per adesso ci hanno detto solamente di smanettare ma nulla di serio ma prima di inziare a creare applicazioni vere vorrei capire bene il concetto! Ho potuto notare questo codice davvero pulito complimenti Zimo e TheKaneB per l'intervento! Ho provato a compilare il codice per vedere il suo funzionamento tutto va bene ma quando vado a inserire la password vera o falsa mi killa il client dicendo che è sempre falsa e non mi fa accedere al terminale di windows! Magari può essere che il server non prende in input la password? Forse tramite 1 scanf si può risolvere? Ovviamente da come avete capito sono alle prime armi ma ci tengo a farla funzionare!Voi siete riusciti?
Grazie in anticipo!

PM Quote
Avatar
Prezioso (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/10/2009

Segnala al moderatore
Postato alle 1:13
Lunedì, 05/10/2009
Testo quotato

Postato originariamente da Zimo:

Grazie per le risposte, tutto va bene tranne un punto:
Codice sorgente - presumibilmente C/C++

  1. send(new_sockfd, "Immettere password: ", 21, 0); //quando vado a scrivere la password mi fa immettere solo un byte, infatti 21 a solo un byte in più
  2. recv(new_sockfd, pass, 8, 0); //appena immetto un carattere per scrivere la password giusta il client(telnet) esce





Infatti hai ragione io provavo con il client Putty e mi si killava ma provando con telnet fa la stessima cosa pure a me! Non capisco il perchè!8-|

PM Quote
Avatar
ScorpionITA (Member)
Newbie


Messaggi: 15
Iscritto: 28/10/2007

Segnala al moderatore
Postato alle 18:30
Venerdì, 20/11/2009
Prova a sostituire

Codice sorgente - presumibilmente Plain Text

  1. send(new_sockfd, "Immettere password: ", 21, 0);



con:
Codice sorgente - presumibilmente Plain Text

  1. send(new_sockfd, "Immettere password: ", 20, 0);



Io al momento non posso provare perchè sono con linux e windows in panne....

Ultima modifica effettuata da ScorpionITA il 20/11/2009 alle 18:31
PM Quote