07/09/06 22:35
pierotofy
client.sin_addr=*((struct in_addr *)hostinfo->h_addr);
client è la struttura che contiene le informazioni necessarie ad effettuare la connessione con il server.
sin_addr è una variabile della struttura client che contiene l'indirizzo IP.
hostinfo è una variabile di tipo struct hostent che si occupa di risolvere i DNS (sin_addr non accetta nomi di host, solamente indirizzi IP, quindi se un utente digita "mail.libero.it" hostinfo si occupa di convertire questo nome in 193.70.x.x) e la sua variabile h_addr contiene tale indirizzo IP (che è stata impostata durante la chiamata a
hostinfo=gethostbyname(target);
il codice
..(struct in_addr *)..
è un cast esplicito richiesto dal compilatore C per sapere che tipo di dato deve aspettarsi la variabile client.sin_addr.
Se ti serve sapere altro chiedi pure.
Il mio blog: piero.dev
07/09/06 22:48
###
Grazie!!
Comunque non riuscivo a far funzionare le cose più che altro per un banale errore di tipo variabile, in ogni caso ti sei spiegato molto bene e adesso ho le idee più chiare.
Modificando il tuo programma sono riuscito a fare un programma console che si connette a un server, uso la tua stessa funzione recv_packet per ricevere i messaggi dal server, il problema è che se stampo questi sulla console vedo sempre un cuoricino e il simbolo =.
Hai qualche idea riguardo la possibile causa?
Grazie ancora, ciao ciao!!
Comunque non riuscivo a far funzionare le cose più che altro per un banale errore di tipo variabile, in ogni caso ti sei spiegato molto bene e adesso ho le idee più chiare.
Modificando il tuo programma sono riuscito a fare un programma console che si connette a un server, uso la tua stessa funzione recv_packet per ricevere i messaggi dal server, il problema è che se stampo questi sulla console vedo sempre un cuoricino e il simbolo =.
Hai qualche idea riguardo la possibile causa?
Grazie ancora, ciao ciao!!
aaa
12/09/06 10:57
###
Sono andato avanti con il winsock ma non riesco a risolvere un problema, sto facendo un semplice programma che si connetta a un server, invii alcuni messaggi da tastiera e chiuda la connessione. Per adesso riesco a ricevere il messaggio di benvenuto ma quasi sempre il programma si blocca dopo l'invio del primo messaggio
non ho ancora scritto il codice per chiudere la connessione perchè prima voglio risolvere il problema.
Grazie a chi mi sia di aiuto!
#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32 #include <winsock2.h> #else #define SOCKET_ERROR 0 #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #endif #define MAX_CHAR_LENGTH 60 #define MAX_MESSAGE_LENGTH 4096 HANDLE MyHandle; int ConnectTo(char *target,int PORT) //Funzione di connessione al server specificato { int sock; struct sockaddr_in client; struct hostent *hostandress; //Inizializza il socket WORD version; WSADATA WSAData; version=MAKEWORD(1,1); WSAStartup(version, &WSAData); //Avvia il socket if( (sock=socket(AF_INET,SOCK_STREAM,0)) == SOCKET_ERROR ) { printf("error at socket \n"); return -1; } //Ricava l'indirizzo dell'host hostandress=gethostbyname(target); if( hostandress==NULL ) { printf("error at gethostbyname \n"); return -1; } //Imposta la connessione con il server... client.sin_family=AF_INET; client.sin_addr=*((struct in_addr *)hostandress->h_addr); client.sin_port=htons(PORT); //Si connette al server... if( connect(sock,(struct sockaddr *)&client, sizeof(client)) ) { printf("error at server connection \n"); return -1; } printf("Connection as success full!! \n"); return sock; } void Receiv(int sock) //Funzione per la ricezione dei dati { char *response; int res; response=malloc(sizeof(char)*MAX_CHAR_LENGTH); res=recv(sock,response,MAX_CHAR_LENGTH,0); if( res>=0 ) { *(response+res)='Sono andato avanti con il winsock ma non riesco a risolvere un problema, sto facendo un semplice programma che si connetta a un server, invii alcuni messaggi da tastiera e chiuda la connessione. Per adesso riesco a ricevere il messaggio di benvenuto ma quasi sempre il programma si blocca dopo l'invio del primo messaggio
#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32 #include <winsock2.h> #else #define SOCKET_ERROR 0 #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #endif #define MAX_CHAR_LENGTH 60 #define MAX_MESSAGE_LENGTH 4096 HANDLE MyHandle; int ConnectTo(char *target,int PORT) //Funzione di connessione al server specificato { int sock; struct sockaddr_in client; struct hostent *hostandress; //Inizializza il socket WORD version; WSADATA WSAData; version=MAKEWORD(1,1); WSAStartup(version, &WSAData); //Avvia il socket if( (sock=socket(AF_INET,SOCK_STREAM,0)) == SOCKET_ERROR ) { printf("error at socket \n"); return -1; } //Ricava l'indirizzo dell'host hostandress=gethostbyname(target); if( hostandress==NULL ) { printf("error at gethostbyname \n"); return -1; } //Imposta la connessione con il server... client.sin_family=AF_INET; client.sin_addr=*((struct in_addr *)hostandress->h_addr); client.sin_port=htons(PORT); //Si connette al server... if( connect(sock,(struct sockaddr *)&client, sizeof(client)) ) { printf("error at server connection \n"); return -1; } printf("Connection as success full!! \n"); return sock; } void Receiv(int sock) //Funzione per la ricezione dei dati { char *response; int res; response=malloc(sizeof(char)*MAX_CHAR_LENGTH); res=recv(sock,response,MAX_CHAR_LENGTH,0); if( res>=0 ) { *(response+res)='{parsed_message}'; } SetConsoleTextAttribute(MyHandle,10); printf(response); SetConsoleTextAttribute(MyHandle,12); } int Send(int sock, char *message) //Funzione per l'invio dei dati { int len=strlen(message); if( send(sock,message,len,0) == SOCKET_ERROR ) { printf("error at send \n"); return -1; } return 0; } ///////////////////////////////*MAIN*///////////////////////////////// int main(int argc, char *argv[]) { MyHandle=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("WINSOCK CONVERSATION 1.0"); int sock; int port; char *target; char *message; target=malloc(sizeof(char)*MAX_CHAR_LENGTH); message=malloc(sizeof(char)*MAX_CHAR_LENGTH); CONNECT:; printf("Connect To: "); scanf("%s",target); printf("Port: "); scanf("%d",&port); sock=ConnectTo(target,port); if( sock==-1 ) { goto CONNECT; } for(;;) { Receiv(sock); scanf("%s",message); Send(sock,message); } system("PAUSE"); return 0; }
non ho ancora scritto il codice per chiudere la connessione perchè prima voglio risolvere il problema.
Grazie a chi mi sia di aiuto!'; } SetConsoleTextAttribute(MyHandle,10); printf(response); SetConsoleTextAttribute(MyHandle,12); } int Send(int sock, char *message) //Funzione per l'invio dei dati { int len=strlen(message); if( send(sock,message,len,0) == SOCKET_ERROR ) { printf("error at send \n"); return -1; } return 0; } ///////////////////////////////*MAIN*///////////////////////////////// int main(int argc, char *argv[]) { MyHandle=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTitle("WINSOCK CONVERSATION 1.0"); int sock; int port; char *target; char *message; target=malloc(sizeof(char)*MAX_CHAR_LENGTH); message=malloc(sizeof(char)*MAX_CHAR_LENGTH); CONNECT:; printf("Connect To: "); scanf("%s",target); printf("Port: "); scanf("%d",&port); sock=ConnectTo(target,port); if( sock==-1 ) { goto CONNECT; } for(;;) { Receiv(sock); scanf("%s",message); Send(sock,message); } system("PAUSE"); return 0; }
non ho ancora scritto il codice per chiudere la connessione perchè prima voglio risolvere il problema.
Grazie a chi mi sia di aiuto!
Ultima modifica effettuata da ### 12/09/06 10:58
aaa
22/10/06 11:06
norbix89
ho fatto da poco il mio client e server FUNZIONANTI
solo che non riesce mai a risolvere i DNS in IP, come RISOLVO il problema?
solo che non riesce mai a risolvere i DNS in IP, come RISOLVO il problema?
aaa
17/11/06 15:43
norbix89
come per quasi ogni altra cosa riguardante computer/programmazzione, mi sono arrangiato
se volete potete visitare xxx e trovate una chat nei progetti C/C++, fatta da me
Ho modificato in quanto violava il regolamento
se volete potete visitare xxx e trovate una chat nei progetti C/C++, fatta da me
Ho modificato in quanto violava il regolamento
Ultima modifica effettuata da pierotofy 18/11/06 4:21
aaa