Oppure

Loading
15/08/09 20:42
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?
#include<windows.h>
#include<winsock2.h>
#include<stdio.h>

int main(void){
SOCKET sockfd, new_sockfd;
WSADATA data;
struct sockaddr_in host_addr, client_addr;
WORD p;
int sin_size;
p = MAKEWORD(2,0);
WSAStartup(p, &data);
if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
	printf("Errore inizializzazzione socket");

host_addr.sin_family= PF_INET;
host_addr.sin_port=htons(7890);
host_addr.sin_addr.s_addr= 0;

if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
	printf("Errore collegamento socket porta");

if(listen(sockfd, 1) == -1)
	printf("Errore coda client");

while(1){
sin_size = sizeof(struct sockaddr);
new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
if(new_sockfd == -1)
	printf("Errore accettazione connessione!");

printf("ih");

send(new_sockfd, "Salve", 6, 0);
if(send(new_sockfd, "Immettere password: ", 20, 0) == "camera"){
send(new_sockfd, "Esatto", 7, 0);
closesocket(new_sockfd);
} else {
send(new_sockfd, "Errore", 8, 0);
closesocket(new_sockfd);
}
closesocket(new_sockfd);
}
WSACleanup();
return 0;
}
Ultima modifica effettuata da Zimo 15/08/09 20:44
aaa
16/08/09 0:13
pierotofy
In che senso "appaiono tutti i caratteri"?
Il mio blog: piero.dev
16/08/09 7:43
Zimo
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.
aaa
17/08/09 0:25
TheKaneB
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?
#include<windows.h>
#include<winsock2.h>
#include<stdio.h>

int main(void){
SOCKET sockfd, new_sockfd;
WSADATA data;
struct sockaddr_in host_addr, client_addr;
WORD p;
int sin_size;
p = MAKEWORD(2,0);
WSAStartup(p, &data);
if((sockfd == socket(PF_INET, SOCK_STREAM, 0)) == -1)
	printf("Errore inizializzazzione socket");

host_addr.sin_family= PF_INET;
host_addr.sin_port=htons(7890);
host_addr.sin_addr.s_addr= 0;

if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
	printf("Errore collegamento socket porta");

if(listen(sockfd, 1) == -1)
	printf("Errore coda client");

while(1){
sin_size = sizeof(struct sockaddr);
new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size);
if(new_sockfd == -1)
	printf("Errore accettazione connessione!");

printf("ih");

send(new_sockfd, "Salve", 6, 0);
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.
send(new_sockfd, "Esatto", 7, 0);
closesocket(new_sockfd);
} else {
send(new_sockfd, "Errore", 8, 0);
closesocket(new_sockfd);
}
closesocket(new_sockfd);
}
WSACleanup();
return 0;
}


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

oscene.net/it/programmazione/c/…
Ultima modifica effettuata da TheKaneB 17/08/09 0:27
aaa
17/08/09 9:47
Zimo
Grazie per le risposte, tutto va bene tranne un punto:
#include<windows.h>
#include<winsock.h>
#include<stdio.h>
#include<stdlib.h>

#define PORTA 7890 

int main(void){
SOCKET sockfd, new_sockfd;
WSADATA data;
struct sockaddr_in host_addr, client_addr;
WORD p;
int lun;
char pass[8];
p=MAKEWORD(2,0);
WSAStartup(p, &data);

if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
           printf("Errore nel socket");
           
host_addr.sin_family = PF_INET;
host_addr.sin_port = htons(PORTA);
host_addr.sin_addr.s_addr = 0;

if(bind(sockfd, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1)
                printf("Errore binding");
                
if(listen(sockfd, 5) == -1)
                 printf("Errore listening");
                  
while(1){
lun = sizeof(struct sockaddr);
new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &lun);
if(new_sockfd == -1)
              printf("Errore accettazione connessione");
              
printf("Sono connesso...e in esecuzione\n");

send(new_sockfd, "Hello word!\n", 13, 0);
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ù
recv(new_sockfd, pass, 8, 0); //appena immetto un carattere per scrivere la password giusta il client(telnet) esce 
if(strcmp(pass, "camera") == 0){
printf("Password giusta\n");
} else {
printf("Password errata\n");
}
closesocket(new_sockfd);
}
 WSACleanup();
 return 0;
 }


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 17/08/09 9:49
aaa
04/10/09 15:21
Prezioso
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!
aaa
04/10/09 23:13
Prezioso
Postato originariamente da Zimo:

Grazie per le risposte, tutto va bene tranne un punto:
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ù
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-|
aaa
20/11/09 17:30
ScorpionITA
Prova a sostituire

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


con:
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 20/11/09 17:31
aaa