Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Connessione cliente a più server (locali)

    Ciao a tutti, ho un problema con il mio sistema di client-server. Le comunicazioni avvengono sempre correttamente quando i server vengono avviati prima dei client, ma ho un grosso problema quando cerco di eseguire la seguente sequenza di operazioni (raccolte in uno script per il testing dell'applicazione):
    codice:
    #avvio tutti i client:
    ./cliente --param --param &
    ./cliente --param1 --param1 & 
    ./cliente --param2 & 
    
    #avvio i server 
    ./server -par1 
    ./server -par2 
    ./server -par3 
    
    #attendo terminazione client
    sleep 5 
    
    #killo tutti i server
    killall -w server
    In questo caso le connessioni dei vari clienti ai server avvengono in modo del tutto casuale: alle volta comunicano perfettamente, alle volte ci sono scambi di messaggi multipli con alcuni server, altre comunicano con un server solo e così via..

    Il codice del cliente è abbastanza semplice: ho allocato un array di tipo char**, dove ogni puntatore altri non è che il path della socket sulla quale comunicare. Dopo di che, in maniera ciclica, faccio una chiamata alla connect su ogni path, ripetendo la chiamata un numero definito di volte (3), tentativi ripetuti ogni k secondi (1). Tuttavia quando i server sono avviati dopo i client, non riesco proprio a connetterli! Sembra che "non si aspettino", alcune connessioni falliscono e i client non riescono a ripetere il tentativo prima della chiamata a killall che termina i server. Premetto che non posso modificare il tempo di attesa nello script, quindi vi chiedo qualche suggerimento su come cercare di sincronizzare le comunicazioni. Ecco un po di codice del client:

    codice:
    .....
    char **sockpath; //contiene i path delle socket, copiati da un file tramite getline. La copia è ok. 
    int *connect; //array di socket descriptor restituiti dalla chiamata connect; 
    //npath è conteggiato qui, dove ometto tutti i controlli superflui alla soluzione del problema. 
    for(i=0; i<npath;i++){
      connect[i] = openConnection(sockpath[i], NTENTATIVI, NSECONDI);  //analoga alla connect. FUNZIONA.
      if(connect[i] == -1) continue; //passo al sock successivo. 
    }
    
    //altro ciclo per inviare messaggi a tutte le socket di cui sopra. 
    for(i=0;i<npath;i++){
      sendMessage(connect[i], messaggio);   //funzione da me realizzata, analoga alla send. FUNZIONA.
      //sveglio il ricevente
      signal(wait_msg); 
     //attendo una risposta
     wait(wait_answ); 
      receiveMessage(connect[i], risposta); //analoga alla receive. FUNZIONA.
    }
    //fine
    return 0;
    So che avrei potuto fare tutto in un ciclo, ma le sto provando davvero tutte per cercare di risolvere questi problemi di sincronizzazione, ma anche così facendo, ottengo tutti i socket descriptor, ma i messaggi vengono inviati in maniera casuale. Qualcuno ha qualche suggerimento in merito?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non si capisce tutto ma ti domando ... se openConnection fallisce, le sendMessage utilizzano comunque i socket ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    No, openConnection restituisce -1 se la comunicazione non avviene correttamente, il messaggio è inviato solo se la socket descriptor è > 0

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quindi non è tanta chiara la situazione ... quando le connessioni hanno successo vuol dire che i client si sono collegati ai server (che quindi erano avviati).

    Se i server sono "spenti", tutte le openConnection falliscono e nessun invio/ricezione avviene.

    Non è chiaro se, in qualche modo, ritenti tutte le openConnection se queste sono fallite ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Si, ritento le connessioni 3 volte a distanza di 1 secondo l'una dall'altra. Il problema sta nell'invio, che è del tutto casuale. Ho notato diverse situazioni: invia 3 volte lo stesso messaggio sulla stessa socket, invio di un messaggio su una sola socket e nessun messaggio d'errore per gli altri. In pratica è come se killall non solo terminasse i server, ma anche i clienti! Se il server è terminato il cliente dovrebbe ricevere un messaggio d'errore quando effettua la sendMessage, invece no!

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.