PDA

View Full Version : [C++] Problemi con la creazione di un server con winsock


MrModd
20-03-2009, 22:22
Ciao, ho bisogno di collegare due eseguibili in rete. Uno deve essere client e l'altro server. Per il client uso una mia funzione che fin'ora non mi ha mai dato problemi, ma per il server non so come fare.
Ho provato modificando la mia funzione, ma non funziona. Ve la mostro:

//Impostazione socket e connessione con l'host
//con option=1 imposta il socket e si connette al server host:port
//con option=2 chiude la connessione
//con option=3 imposta il socket in modalità server
//controlla automaticamente se l'host è un IPV4 o un dominio
//restituisce:
// -1 se c'è stato un errore generico (molto probabilmente un errore di sintassi nella function call)
// 0 se ha eseguito le operazioni senza errori
// 1 se non è riuscito ad inizializzare o terminare il socket (WSAStartup(), WSACleanup())
// 2 se non è riuscito ad importare l'host
// 3 se non è riuscito a creare il socket
// 4 se non è riuscito a ricevere una connessione (impostato come server)
int connessione(int option, char *server, int porta)
{
switch (option)
{
case 1: //Connessione
{
if (WSAStartup(MAKEWORD(2,0),&data)!=0) return 1;
conn=socket(PF_INET,SOCK_STREAM,0);
conn_addr.sin_family=PF_INET;
if (inet_addr(server)==INADDR_ANY || inet_addr(server)==INADDR_NONE) //Con il nome dell'host
{
conn_addr.sin_port=htons(porta);
host=gethostbyname(server);
}
else //Con indirizzo IP
{
conn_addr.sin_port=htons(porta);
indirizzo.s_addr= inet_addr(server);
host=gethostbyaddr((char *)&indirizzo,4, AF_INET);
}
if (host==NULL) return 2; //Errore nell'impostazione dell'host
conn_addr.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
lun=sizeof(struct sockaddr);
if(connect(conn,(struct sockaddr*)&conn_addr,lun)!=0) return 3; //Socket non creato
return 0; //OK
}
case 2: //Chiusura socket
{
if (closesocket(conn)!=0) return 1;
if (WSACleanup()!=0) return 1;
host=NULL;
return 0; //OK
}
case 3: //Connessione come server
{
if (WSAStartup(MAKEWORD(2,0),&data)!=0) return 1;
conn=socket(PF_INET,SOCK_STREAM,0);
conn_addr.sin_family=PF_INET;
conn_addr.sin_port=htons(porta);
inet_addr(server)==INADDR_ANY;
if (bind(conn,(struct sockaddr*)&conn_addr,sizeof(struct sockaddr_in))!=0) return 3;
lun=sizeof(struct sockaddr);
sk_srv=accept(conn,(struct sockaddr*)&srv_addr,&lun);
if (sk_srv==INVALID_SOCKET) return 4;
}
default:
{
return -1; //Errore di sintassi nella function call
}
}
return -1; //Errore di sintassi nella function call
}

La creazione del server avviene se option=3. C'è qualche istruzione che devo modificare? Considerate che tutte le variabili usate sono state dichiarate in ambito globale.

MrModd
21-03-2009, 12:15
UP