Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Server multithread
Forum - C/C++ - Server multithread

Avatar
giusy_m86 (Normal User)
Pro


Messaggi: 143
Iscritto: 09/07/2008

Segnala al moderatore
Postato alle 15:43
Venerdì, 13/11/2009
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#

  1. Accetta_connessioni=accept(server,NULL,NULL);
  2.      }
  3.    
  4.      printf("Un client ha effettuato una connessione!\n");
  5.       count ++;
  6.       cl ++;
  7.       printf("N. client: %d\n", cl);
  8.       printf("Client connessi: %d\n\n", count);
  9.     hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);
  10.        
  11.      }
  12.  
  13. }  
  14.      
  15.  
  16.    
  17.    
  18.    
  19.    long WINAPI Thread1(LPWORD ret)
  20. {
  21.     int ricevuto;
  22.      char ricezione_dati[256];
  23.      do{
  24.      
  25.      recv(server,ricezione_dati,256,0);
  26.      printf("\nHo ricevuto dal client%d>>> %s ",cl,ricezione_dati);
  27.  
  28.      }
  29.      while(strcmp(ricezione_dati,"Chiuditi")!=0);
  30.      getchar();
  31.      
  32.      closesocket(server);
  33.      WSACleanup();
  34.      return 0;
  35.      
  36. }



Help me!!!:hail:

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:28
Venerdì, 13/11/2009
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.


Il mio blog: https://piero.dev
PM Quote
Avatar
giusy_m86 (Normal User)
Pro


Messaggi: 143
Iscritto: 09/07/2008

Segnala al moderatore
Postato alle 16:53
Venerdì, 13/11/2009
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <winsock.h>
  3. #include <windows.h>
  4.  
  5. long WINAPI Thread1(LPWORD ret);
  6.  
  7. int cl= 100;
  8. SOCKET server;
  9.  
  10. int main (){
  11.     HANDLE hThread[1];
  12.     DWORD dwID[1];
  13.     int count=0;
  14.     int d;
  15.      
  16.      
  17.      WSADATA wsadata;
  18.      int Versione= WSAStartup(MAKEWORD(2,2),&wsadata);
  19.      
  20.      if(Versione!=NO_ERROR){
  21.      printf("Errore nell'inizializzazione delle socket\n");
  22.      return 1;
  23.      }
  24.  
  25.  
  26.  
  27.      
  28.    
  29.      
  30.      server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  31.      
  32.      if(server==INVALID_SOCKET){
  33.      printf("Errore: Socket non valida\n");
  34.      return 1;
  35.      }
  36.  
  37.      SOCKADDR_IN  parametri_server;
  38.      
  39.      parametri_server.sin_family=AF_INET;
  40.    
  41.      parametri_server.sin_addr.s_addr = INADDR_ANY;
  42.    
  43.      parametri_server.sin_port=htons(1000);
  44.    
  45.      //FUNZIONE BIND
  46. int funzione_bind;
  47. funzione_bind=bind( server, (SOCKADDR*) &parametri_server, sizeof(parametri_server));
  48. if(funzione_bind ==SOCKET_ERROR ){
  49. /*if(bind!=0){
  50. printf("Funzione bind non riuscita\\n");*/
  51. //Chiudiamo correttamente la socket
  52. printf("Errore\n");
  53. closesocket(server);
  54. WSACleanup();
  55.       }
  56.        
  57.      int funzione_listen;
  58.      funzione_listen=listen(server,1);
  59.      if(funzione_listen ==SOCKET_ERROR){
  60.  
  61.      printf("Errore nella funzione listen \n");
  62.      closesocket(server);
  63.      WSACleanup();
  64.      return 1;
  65.      }
  66.  
  67.      SOCKET Accetta_connessioni;
  68.    
  69.      printf("Attendo la connesione di un client\n");
  70.      while(1){
  71.      
  72.      Accetta_connessioni=ERROR;
  73.      
  74.      while(Accetta_connessioni==ERROR){
  75.      
  76.      Accetta_connessioni=accept(server,NULL,NULL);
  77.      }
  78.    
  79.      printf("Un client ha effettuato una connessione!\n");
  80.       count ++;
  81.       cl ++;
  82.       printf("N. client: %d\n", cl);
  83.       printf("Client connessi: %d\n\n", count);
  84.     hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);
  85.        
  86.      }
  87.  
  88. }  
  89.      
  90.  
  91.    
  92.    
  93.    
  94.    long WINAPI Thread1(LPWORD ret)
  95. {
  96.     int ricevuto;
  97.      char ricezione_dati[256];
  98.      do{
  99.      
  100.      recv(server,ricezione_dati,256,0);
  101.      printf("\nHo ricevuto dal client%d>>> %s ",cl,ricezione_dati);
  102.  
  103.      }
  104.      while(strcmp(ricezione_dati,"Chiuditi")!=0);
  105.      getchar();
  106.      
  107.      closesocket(server);
  108.      WSACleanup();
  109.      return 0;
  110.      
  111. }



Perchè non accetta altre connessioni? Funziona solo con 1 solo client!


giusy_m86 ha allegato un file: exe.jpg (134833 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da giusy_m86 il 16/11/2009 alle 8:54
PM Quote
Avatar
giusy_m86 (Normal User)
Pro


Messaggi: 143
Iscritto: 09/07/2008

Segnala al moderatore
Postato alle 8:56
Lunedì, 16/11/2009
Help me!!! è importantissimo!

PM Quote
Avatar
giusy_m86 (Normal User)
Pro


Messaggi: 143
Iscritto: 09/07/2008

Segnala al moderatore
Postato alle 11:47
Lunedì, 16/11/2009
Per intenderci...sono proprio lontano dalla creazione di un server multithread (multiclient) con queste  linee di codice?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:24
Lunedì, 16/11/2009
Beh ad occhio il problema e' qui...

Codice sorgente - presumibilmente C/C++

  1. printf("Attendo la connesione di un client\n");
  2.      while(1){
  3.    
  4.      Accetta_connessioni=ERROR;
  5.    
  6.      while(Accetta_connessioni==ERROR){
  7.    
  8.      Accetta_connessioni=accept(server,NULL,NULL);
  9.      }
  10.  
  11.      printf("Un client ha effettuato una connessione!\n");
  12.       count ++;
  13.       cl ++;
  14.       printf("N. client: %d\n", cl);
  15.       printf("Client connessi: %d\n\n", count);
  16.     hThread[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);
  17.      
  18.      }



A parte che il ciclo infinito impedira' l'esecuzione del codice sottostante, ma il codice qui:

Codice sorgente - presumibilmente C/C++

  1. while(Accetta_connessioni==ERROR){
  2.    
  3.      Accetta_connessioni=accept(server,NULL,NULL);
  4.      }



Mi sembra un tantino illogico; riguardanti qualche esempio di client/server in C++.

http://www.codeproject.com/KB/IP/winsockintro01.aspx


Il mio blog: https://piero.dev
PM Quote
Avatar
ScorpionITA (Member)
Newbie


Messaggi: 15
Iscritto: 28/10/2007

Segnala al moderatore
Postato alle 21:22
Venerdì, 20/11/2009
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++

  1. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwID[0]);


con
Codice sorgente - presumibilmente Plain Text

  1. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,Accetta_connessioni,0,&dwID[0]);



e
Codice sorgente - presumibilmente C/C++

  1. long WINAPI Thread1(LPWORD ret)


con
Codice sorgente - presumibilmente C/C++

  1. int Thread1(SOCKET Accetta_connessioni)



in questo modo dovrebbe andare...
se ti serve documentazione sui socket dovrei avere da qualche parte alcuni pdf

PM Quote