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++ - Problema con server multithread in C (2)
Forum - C/C++ - Problema con server multithread in C (2)

Avatar
trenta3 (Normal User)
Newbie


Messaggi: 16
Iscritto: 17/12/2008

Segnala al moderatore
Postato alle 13:40
Domenica, 21/12/2008
:alert:
Vi volevo segnalare che ho trovato un ottimo tutorial sui thread (http://forum.html.it/forum/showthread/t-1120765.html) e ho fatto questo programma come server:

Il problema è che, nel thread chiamato thread1 quando c'è il comando recv il programma non riconosce server(1° parametro) perchè sta nell'altra funzione(main), come posso fare?
  
Help Me! :d          

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


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:13
Domenica, 21/12/2008
Dichiaralo come variabile globale oppure (sarebbe meglio) passarlo come parametro al thread.


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


Messaggi: 16
Iscritto: 17/12/2008

Segnala al moderatore
Postato alle 20:01
Domenica, 21/12/2008
Grazie pierotofy,
Però ho un' altro problema:
Il server adesso non fa che stampare a video una serie di simbolini incomprensibili appena un client si connette.
Ho provato in vari modi ma non riesco.

PM Quote
Avatar
giusy_m86 (Normal User)
Pro


Messaggi: 143
Iscritto: 09/07/2008

Segnala al moderatore
Postato alle 16:05
Sabato, 14/11/2009
A distanza di un anno ho il tuo stesso problema! :-( sei riuscito a risolvere? se si come?

PM Quote
Avatar
trenta3 (Normal User)
Newbie


Messaggi: 16
Iscritto: 17/12/2008

Segnala al moderatore
Postato alle 16:05
Venerdì, 20/11/2009
no, purtroppo non sono riuscito a risolvere il problema e ho abbondonato il progetto. :d

PM Quote
Avatar
ScorpionITA (Member)
Newbie


Messaggi: 15
Iscritto: 28/10/2007

Segnala al moderatore
Postato alle 18:15
Venerdì, 20/11/2009
Ciao, ;) una volta anche io mi sono trovato nel tuo stesso problema e alla fine ho risolto con una variabile globale, comunque se ti interessa creare un applicazione client/server multiutente ti consiglio l'utilizzo della funzione select che personalmente ritengo più comoda e performante... se ti interessa dovrei avere da qualche parte un paio di pdf sull'argomento...

PM Quote