Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
07/09/06 18:26
###
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 :k::k:
Ultima modifica effettuata da ### 07/09/06 18:27
aaa
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!! :k:
aaa
08/09/06 9:12
###

Tranquillo Piero, ho risolto, grazie comunque per la disponibilità;)
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

#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.:d

Grazie a chi mi sia di aiuto!:k::k:'; } 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.:d

Grazie a chi mi sia di aiuto!:k::k:
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?
aaa
07/11/06 17:00
norbix89
nessuno ha una soluzione?
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
Ultima modifica effettuata da pierotofy 18/11/06 4:21
aaa