Oppure

Loading
21/12/08 12:40
trenta3
:alert:
Vi volevo segnalare che ho trovato un ottimo tutorial sui thread (forum.html.it/forum/showthread/…) 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

#include <stdio.h> 
#include <winsock.h> 
#include <windows.h> 

long WINAPI Thread1(LPWORD ret); 

int cl= 100; 

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; 
     } 



     
     SOCKET server; 
     
     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); 
   
     int funzione_bind; 
     funzione_bind=bind( server, (SOCKADDR*) ¶metri_server, sizeof(parametri_server)); 
      if(funzione_bind ==SOCKET_ERROR ){ 
      printf("Funzione bind non riuscita\n"); 

      closesocket(server); 
      WSACleanup(); 
      return 1; 
      } 
       
     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("\nHo ricevuto dal client%d>>> %s ",cl,ricezione_dati); 

     } 
     while(strcmp(ricezione_dati,"Chiuditi")!=0); 
     getchar(); 
     
     closesocket(server); 
     WSACleanup(); 
     return 0; 
     
} 
 
aaa
21/12/08 14:13
pierotofy
Dichiaralo come variabile globale oppure (sarebbe meglio) passarlo come parametro al thread.
Il mio blog: piero.dev
21/12/08 19:01
trenta3
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.
aaa
14/11/09 15:05
giusy_m86
A distanza di un anno ho il tuo stesso problema! :-( sei riuscito a risolvere? se si come?
aaa
20/11/09 15:05
trenta3
no, purtroppo non sono riuscito a risolvere il problema e ho abbondonato il progetto. :d
aaa
20/11/09 17:15
ScorpionITA
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...
aaa