Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51

    [C]fallimento connect su server multithread

    Salve,
    sto implementando un'applicazione composta da un server multi threading ma ho incontrato un problema singolare, che magari qualcuno con più esperienza di me con i socket saprà a cosa può essere dovuto.
    Il mio server è composto di un server principale che accetta connessioni da parte di client,dedicandogli un nuovo thread.Questo thread apre una nuova connessione su un nuovo socket aspettando che il client a sua volta vi si connetta tramite una connect.
    Ho implementato il tutto e tutto funziona normalmente, ma solo per il primo thread creato:se subito dopo la morte del primo thread dedicato, ne viene creato un altro su richiesta di un nuovo client(connessosi al server principale), il tentativo di creare la nuova connessione fallisce,perchè la connect del client fallisce.
    Perchè questo comportamento?i socket gli chiudo correttamente al termine del thread chiamando prima la shutdown e poi la close.
    So che senza codice è un brancolare all buio, ma dato che il tutto è abbastanza lungo, speravo di poter evitare di pubblicare il papiro se qualcuno si fosse già imbattuto in un problema simile.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    No ... un problema del genere e' dovuto ad errori logici nel tuo programma che, se non si vede ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    Potrei restringere il campo ad una parte...non so magari, è un problema della funzione che crea il thread, o di gestione dei socket...dove potrebbe essere l'errore per giustificare un tale comportamento? ho notato che non lo fa sempre sul secondo thread,a volte anche il secondo va con successo, mentre mi si blocca sul terzo....mah....un comportamento piuttosto singolare, a quanto pare sbaglio qualcosa che lascia alla macchina la possibilità di comportarsi in diverso modo...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Comincia a mostrare la parte del codice che ascolta e crea il thread alla connessione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    In pratica questo è il server principale:


    codice:
    INT main(int argc, char* argv []){
    
    
    /* AMBIENTE WINDOWS  */ 
    
       HANDLE ListaServer[MAX_SERV];
       HANDLE Console;
       DWORD ConsoleId;
       DWORD ServID[MAX_SERV];
       SOCKADDR_IN Client_addr;
       SOCKET listenSocket;
       SOCKET connessione;
       int id_serv,sin_size,i;
       LONG volatile n_serv;
       LONG volatile client[MAX_SERV];
       serv_arg* param;
    
    
    /*inizializzazione libreria Socket*/
    
       WORD wVersionRequested = MAKEWORD(2,2);
       WSADATA wsaData;
       int wsastartup = WSAStartup(wVersionRequested, &wsaData);
       if (wsastartup != NO_ERROR) printf("Errore WSAStartup()\n");
       
       id_serv=0;
       for(i=0;i<MAX_SERV;i++) client[i]=0;
    
    
    /*Inizializzazione connessione server*/
    
       ConnessioneServer("127.0.0.1",N_PORT,&listenSocket);
       
       printf("Mainserver in attesa di client..\n");
    
       while(1){
                connessione = accept(listenSocket, (struct sockaddr*)&Client_addr, &sin_size);
    	    printf("Accettata Connessione con Client: %s su socket %d\n", inet_ntoa(Client_addr.sin_addr),connessione);
    	    InterlockedIncrement(&n_serv);
                param=malloc(sizeof(serv_arg));
                 for(i=0;i<MAX_SERV;i++) { if(client[i]==0){ InterlockedIncrement(&(client[i]));
                                                              break; }
                 }
                (*param).nserv=&(client[i]);
                (*param).idServ=i;
                (*param).conn=connessione;
                (*param).clientAddr.sin_family = AF_INET;
                (*param).clientAddr.sin_addr.s_addr=Client_addr.sin_addr.s_addr;
                (*param).clientAddr.sin_port=Client_addr.sin_port;
    
                ListaServer[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)server,param,0,&ServID[i]);
    
    	    }
    
       shutdown(listenSocket,2);
       close(listenSocket);
    
       WSACleanup();
    
       return 0;
    
    }

    dove server e la struttura a cui punta param sono definite così:

    codice:
    DWORD WINAPI server(serv_arg* param);
    
    typedef struct serv_arg{
      SOCKET conn;
      SOCKADDR_IN clientAddr;
      int idServ;
      LONG volatile* nserv;} serv_arg;

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Mostra la ConnessioneServer ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    E' vero,scusami....

    codice:
    int ConnessioneServer(char* addr,int port,SOCKET* listenSocket){
      
      SOCKADDR_IN Server_addr;
      SOCKADDR_IN Client_addr;
      int sin_size;
      
      *listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (listenSocket < 0) { perror("ConnessioneServer,Errore socket");
                              ChiudiSocket(*listenSocket);
                              return -1; }
      
      Server_addr.sin_family = AF_INET;
      Server_addr.sin_addr.s_addr = inet_addr(addr);
      Server_addr.sin_port = htons(port);
    
      sin_size = sizeof(SOCKADDR_IN);
      
      if (bind(*listenSocket,(LPSOCKADDR)&Server_addr,sin_size) < 0){
         perror("ConnessioneServer,Errore bind");
         ChiudiSocket(*listenSocket);
         return -1; }
      
      if((listen(*listenSocket, MAX_SERV))<0) { perror("ConnessioneServer,Errore listen");
                                                ChiudiSocket(*listenSocket);
                                                return -1; }
      return 0;
      
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Quanto vale MAX_SERV ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    20

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Quanto è brutto vedere quel listensocket deferenziato così tante volte.
    Alla fine è un numero intero, quindi passarlo per valore o riferimento non serve a niente. Ritornalo dalla funzione e controllalo se diverso da INVALID_SOCKET
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.