Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [C] Socket in C

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    15

    [C] Socket in C

    Salve ragazzi. Ho realizzato un programma che gestisce la comunicazione client-server,con varie applicazioni. Sostanzialmente ho due problemi.

    1) Avendo realizzato un Server di tipo concorrente,l'accesso al Server da parte dei Client è mutuamente esclusivo? ... nel senso che se un Client accede al Server,successivamente se un altro Client tenta di accedere al Server questo risulterà occupato,se il primo Client è ancora connesso al Sever?

    2) La seconda domanda riguarda i socket. Una volta creato un socket,è possibile effettuare più volte un send & recv su di esso,oppure è necessario chiuderlo e ricrearlo per poter inviare più messaggi? ... vi chiedo questo perché per alcuni client il secondo messaggio viene letto correttamente,mentre per altri il secondo messaggio non arriva proprio.

    Vi ringrazio anticipatamente per le eventuali risposte.

    P.S. Scusate la forma "abbastanza" sconclusionata delle domande... Ciao ciao.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    per quanto riguarda la prima domanda è chiaro che se appunto il server è concorrente potrà servire più client in contemporanea, toccherà a te scrivere opportunamente il codice in modo tale che ciò accada usando fork o thread.
    per la seconda dipende sempre da come implementi il tuo progetto ma chiaramente potrai usare la socket per più trasmissiono ovviamente sempre verso lo stesso client. ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    15
    Grazie mille. Il secondo problema l'ho risolto.
    Il socket non inviava i dati attesi,semplicemente perché effettuavo nel server due send consecutivi. Alternando invece send/recv/send funziona come dovrebbe.

    Per quanto riguarda il primo problema brancolo ancora nel buio. Allora all'interno del server dopo la chiamata listen ho questo codice :

    while (1) {
    if ((temp_sd=accept(sd,(struct sockaddr *)&client,& address_size))<0) {
    perror("...");exit(-1);
    }
    if ((pid=fork())<0) {
    perror("...");exit(-1);
    }
    if (pid==0){
    close(sd);

    // Ricevo i dati dal Client //

    close(temp_sd);
    exit(0);
    }
    else { close(temp_sd); }
    }
    exit (0);

    Nel caso in cui i client accedano ad un file,lo stesso per ogni client,dorei sincronizzare il loro accesso al file con dei mutex??? Creando anche dei thread relativi ai Client??? ...
    Se possibilmente potessi avere un piccolo esempio ve ne sarei molto grato.

    Ancora grazie... Ciao ciao.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    qualora i file non vengano modificati la concorrenza in lettura non si pone, viceversa se i file venissero modificati è normale che debbano essere protetti da una sezione critica attraverso l'uso di mutex. La concorrenza viene però implementata attraverso l'uso di fork o thread lato server, non lato client dove lui non si renderà conto della concorrenza. Puoi continuare così semplicemente utilizzando la fork e nel processo figlio dopo la accept, nella sezione in cui il pid==0 inserire il codice concorrente. In tal caso però non so bene come comportarsi con i mutex, se dovessi usarli ti converrebbe passare penso ai thread, generandone uno per ogni accept che genera una nuova socket, quindi per ogni client che viene servito. ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    15
    Ciao ragazzi. Nuovi problemi con la realizzazione del Server. Allora effettuo la chiamata pthread_create dopo la chiamata della funzione accept all'interno del cliclo while(1) {} del server. Siccome uno dei parametri della funzione pthrea_create è l'indirizzo della funzione dalla quale il trherad inizia :

    - pthread_create(pthread_t *THREAD,pthread_attr_t *ATTR,void * (*START_ROUTINE)(void *), void * ARG);

    mi riferisco quinid al secondo parametro che viene passato alla funzione sopra ... vi chiedo è possibile che all'interno di tale funzione ci sia anche la chiamata ad un'altra funzione???
    quindi :

    void *STAR_ROUTINE (void *arg) {

    // codice

    // chiamata ad un'altra funzione

    // altro codice
    }

    vi chiedo questo perché implementando una cosa del genere,in fase di compilazione mi viene restituito un errore di conflittto con la chiamata della funzione interna alla funzione START_ROUTINE ... avete dei suggerimenti??? Grazie mille per le eventuali risposte. Ciao ciao.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Che genere di errore?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    49
    si si può chiamare tranquillamente una funziona dentro la thread function sta a vedere se tu passi a questa il puntatore all'altra funzione e magari sbagli qualcosa

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    15
    Allora glie errori che mi da sono questi :

    1) All'interno della funzione thread function,quando effettuo la chiamata all'altra funzione :

    conflict types for "Nome Funzione"

    2) Il secondo fa riferimento sempre alla funzione interna,ma l'errore è riferito al suo prototype :

    previous implicit declaration of "Nome Funzione" was here

    Grazie ancora ragazzi..

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quale altra funzione?
    Finché non fornisci tutti i dettagli é difficile capire il problema.
    Non è che stai cercando di usare una fantomatica funzione senza aver inserito l'header corrispondente?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    15
    Cerco di fornire più dettagli.

    -Effettuo la creazione del thread :

    pthread_create(&tid,NULL,gestisci,NULL);

    -La funzione gestisci :

    void *gestisci (void *arg) {

    int i,j;

    // Codice gestisci

    controlla(i,j); // Chiamata "all'altra funzione" (*)

    // Altro codice gestici

    }

    void controlla (int i,int j); // Prototype "dell'altra funzione". (*)

    Spero di aver aggiunto particolari maggiormente rilevanti... grazie ancora.
    (*) L'errore mi viene dati in questi due punti...

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.