Forum - C/C++
- Server multithread
giusy_m86 (Normal User)
Pro
Messaggi: 143
Iscritto: 09/07/2008
Salve, ho scritto una semplicissima chat...ma i primi problemi li sto avendo con il server, voglio che riesca a comunicare contemporaneamente con più client, ho creato un thread (s.o.:Windows), ma non mi funziona...posto una parte del codice
Codice sorgente - presumibilmente C#
Accetta_connessioni= accept( server,NULL ,NULL ) ;
}
printf( "Un client ha effettuato una connessione!\n " ) ;
count ++;
cl ++;
printf( "N. client: %d\n " , cl) ;
printf( "Client connessi: %d\n \n " , count) ;
hThread[ 0] = CreateThread( NULL ,0,( LPTHREAD_START_ROUTINE) Thread1,NULL ,0,& dwID[ 0] ) ;
}
}
long WINAPI Thread1( LPWORD ret)
{
int ricevuto;
char ricezione_dati[ 256] ;
do {
recv( server,ricezione_dati,256,0) ;
printf( "\n Ho ricevuto dal client%d>>> %s " ,cl,ricezione_dati) ;
}
while ( strcmp( ricezione_dati,"Chiuditi" ) != 0) ;
getchar( ) ;
closesocket( server) ;
WSACleanup( ) ;
return 0 ;
}
Help me!!!
pierotofy (Admin )
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
1. Per favore posta tutto il codice (ho almeno l'intera parte del modulo)
2. Specifica che tipo di errore. Un output della console sarebbe perfetto.
giusy_m86 (Normal User)
Pro
Messaggi: 143
Iscritto: 09/07/2008
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <winsock.h>
#include <windows.h>
long WINAPI Thread1( LPWORD ret) ;
int cl= 100 ;
SOCKET server;
int main ( ) {
HANDLE hThread[ 1] ;
DWORD dwID[ 1] ;
int count= 0 ;
int d;
WSADATA wsadata;
int Versione= WSAStartup( MAKEWORD( 2,2) ,& wsadata) ;
if ( Versione! = NO_ERROR) {
printf ( "Errore nell'inizializzazione delle socket\n " ) ;
return 1 ;
}
server= socket( AF_INET,SOCK_STREAM,IPPROTO_TCP) ;
if ( server== INVALID_SOCKET) {
printf ( "Errore: Socket non valida\n " ) ;
return 1 ;
}
SOCKADDR_IN parametri_server;
parametri_server.sin_family = AF_INET;
parametri_server.sin_addr .s_addr = INADDR_ANY;
parametri_server.sin_port = htons( 1000) ;
//FUNZIONE BIND
int funzione_bind;
funzione_bind= bind( server, ( SOCKADDR* ) & parametri_server, sizeof ( parametri_server) ) ;
if ( funzione_bind == SOCKET_ERROR ) {
/*if(bind!=0){
printf("Funzione bind non riuscita\\n");*/
//Chiudiamo correttamente la socket
printf ( "Errore\n " ) ;
closesocket( server) ;
WSACleanup( ) ;
}
int funzione_listen;
funzione_listen= listen( server,1) ;
if ( funzione_listen == SOCKET_ERROR) {
printf ( "Errore nella funzione listen \n " ) ;
closesocket( server) ;
WSACleanup( ) ;
return 1 ;
}
SOCKET Accetta_connessioni;
printf ( "Attendo la connesione di un client\n " ) ;
while ( 1) {
Accetta_connessioni= ERROR;
while ( Accetta_connessioni== ERROR) {
Accetta_connessioni= accept( server,NULL ,NULL ) ;
}
printf ( "Un client ha effettuato una connessione!\n " ) ;
count ++ ;
cl ++ ;
printf ( "N. client: %d\n " , cl) ;
printf ( "Client connessi: %d\n \n " , count) ;
hThread[ 0] = CreateThread( NULL ,0,( LPTHREAD_START_ROUTINE) Thread1,NULL ,0,& dwID[ 0] ) ;
}
}
long WINAPI Thread1( LPWORD ret)
{
int ricevuto;
char ricezione_dati[ 256] ;
do {
recv( server,ricezione_dati,256,0) ;
printf ( "\n Ho ricevuto dal client%d>>> %s " ,cl,ricezione_dati) ;
}
while ( strcmp ( ricezione_dati,"Chiuditi" ) ! = 0) ;
getchar ( ) ;
closesocket( server) ;
WSACleanup( ) ;
return 0 ;
}
Perchè non accetta altre connessioni? Funziona solo con 1 solo client!
Ultima modifica effettuata da giusy_m86 il 16/11/2009 alle 8:54
giusy_m86 (Normal User)
Pro
Messaggi: 143
Iscritto: 09/07/2008
Help me!!! è importantissimo!
giusy_m86 (Normal User)
Pro
Messaggi: 143
Iscritto: 09/07/2008
Per intenderci...sono proprio lontano dalla creazione di un server multithread (multiclient) con queste linee di codice?
pierotofy (Admin )
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
Beh ad occhio il problema e' qui...
Codice sorgente - presumibilmente C/C++
printf("Attendo la connesione di un client\n");
while(1){
Accetta_connessioni=ERROR;
while(Accetta_connessioni==ERROR){
Accetta_connessioni=accept(server,NULL,NULL);
}
printf("Un client ha effettuato una connessione!\n");
count ++;
cl ++;
printf("N. client: %d\n", cl);
printf("Client connessi: %d\n\n", count);
hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);
}
A parte che il ciclo infinito impedira' l'esecuzione del codice sottostante, ma il codice qui:
Codice sorgente - presumibilmente C/C++
while(Accetta_connessioni==ERROR){
Accetta_connessioni=accept(server,NULL,NULL);
}
ScorpionITA (Member )
Newbie
Messaggi: 15
Iscritto: 28/10/2007
Ciao, allora guarda se sei interessato a fare una chat multiclient ti consiglio ti crearti un array di socket e gestirli tramite la funzione select() in quanto hai maggiore performance e una migliore gestione dei vari client connessi, comunque nel tuo codice c'è un errore nel thread che crei tu utilizzi le funzione send e recv passandogli come descrittore socket "server" mentre gli devi passare il valore restituito dalla accept nel tuo caso "Accetta_connessioni" che devi passare al thread come parametro
prova a sostituire
Codice sorgente - presumibilmente C/C++
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);
con
Codice sorgente - presumibilmente Plain Text
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,Accetta_connessioni,0,&dwID[0]);
e
Codice sorgente - presumibilmente C/C++
long WINAPI Thread1(LPWORD ret)
con
Codice sorgente - presumibilmente C/C++
int Thread1(SOCKET Accetta_connessioni)
in questo modo dovrebbe andare...
se ti serve documentazione sui socket dovrei avere da qualche parte alcuni pdf