### (Normal User)
Rookie
Messaggi: 44
Iscritto: 07/09/2006
|
Questo topic è stato chiuso dal moderatore Sto iniziano a studiare i socket, ho letto il codice del programma SendMayl.
Qualcuno sarebbe così gentile da spiegarmi la parte che permette dal nome dell'host
di impostare client.sin_addr? Oppure consigliarmi un link al riguardo
Grazie
Ultima modifica effettuata da ### il 07/09/2006 alle 20:27 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Codice sorgente - presumibilmente Plain Text |
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
Codice sorgente - presumibilmente Plain Text |
hostinfo=gethostbyname(target);
|
il codice
Codice sorgente - presumibilmente Plain Text |
è 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.
|
|
### (Normal User)
Rookie
Messaggi: 44
Iscritto: 07/09/2006
|
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!!
|
|
### (Normal User)
Rookie
Messaggi: 44
Iscritto: 07/09/2006
|
Tranquillo Piero, ho risolto, grazie comunque per la disponibilità
|
|
### (Normal User)
Rookie
Messaggi: 44
Iscritto: 07/09/2006
|
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
Codice sorgente - presumibilmente C++ |
#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)='\0'; } 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 ### il 12/09/2006 alle 12:58 |
|
norbix89 (Normal User)
Newbie
Messaggi: 13
Iscritto: 22/10/2006
|
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?
|
|
norbix89 (Normal User)
Newbie
Messaggi: 13
Iscritto: 22/10/2006
|
nessuno ha una soluzione?
|
|
norbix89 (Normal User)
Newbie
Messaggi: 13
Iscritto: 22/10/2006
|
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
Ultima modifica effettuata da pierotofy il 18/11/2006 alle 5:21 |
|
baffardello (Normal User)
Newbie
Messaggi: 1
Iscritto: 06/04/2009
|
Buon giorno,
vorrei creare un piccolo programma da compilare con Dev C++
ver. 4.9.9.2 ma non ho trovato le librerie winsock
e gli header file all'interno dell'installazione,
Mi potreste indicare dove scaricali,
grazie.
|
|