Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Socket Multi-Client/Server

    Buongiorno a tutti!
    Ho un problema nella realizzazione di una chat client/server.
    Il problema è che non riesco a gestire due client, ovvero il server risponde solo a uno e non a piu di un client connessi.

    Il codice del server è piu meno cosi:
    codice:
    creo socket serverfd
    bind();
    listen(serverfd, );
    
    pthread_t invio;
    pthread_t ricevo;
    
    while(true){
    clientfd=accept(serverfd,  );
    
    new_client=malloc(1); // credo che non servano, basta poi cambiare 
    *new_client=clientfd;  // l'argomento del thread con clientfd
    
    pthread_create(&invio, NULL, funz_invio, (void*) new_client);
    pthread_create(&ricevo, NULL, funz_ricevo, (void*) new_client);
    
    }//fine while
    
    return 0;
    } //fine main
    
    
    void *funz_invio(void *socket){
    int sock= *(int*) socket;
    while(){... send(sock, )..}
    }
    
    void *funz_ricevo(void *socket){
    int sock= *(int*) socket;
    while(){... recv(sock, ) ..}
    }
    
    }
    lo stesso nella parte client ho due thread uno per ricever e uno per inviare praticamente speculari.

    cosa succede:
    il client si connette (e scrive e riceve con il server) //tutto ok!
    il client2 si connette (e scrive al server.. ) // tutto ok!

    il problema è che se il server scrive... riceve solo il client1 e non il client2
    come è possibile? dove sbaglio?

    grazie a tutti quelli che mi daranno una mano!+
    Ultima modifica di skipper87; 13-03-2014 a 11:59

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Queste righe

    new_client=malloc(1);
    *new_client=clientfd;

    cosa dovrebbero fare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Queste righe

    new_client=malloc(1);
    *new_client=clientfd;

    cosa dovrebbero fare?
    pensavo per allorare una porzione diversa per clientfd, ma mi sa tanto di cosa inutile.. però non incide sul programma... quindi il problema è altrove..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Intanto con quelle righe stai "sporcando" la memoria perché allochi un solo byte e ci scrivi clientfd che occupa più spazio.
    Questo tipo di operazioni è "imprevedibile" e potrebbe causare di tutto al tuo programma. Considerando che lo passi ai nuovi thread ci starei molto attento.

    In più, le funzioni si chiamano funz_invio e funz_ricevo ma tu passi l'indirizzo di invio e ricevo (?) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Intanto con quelle righe stai "sporcando" la memoria perché allochi un solo byte e ci scrivi clientfd che occupa più spazio.
    Questo tipo di operazioni è "imprevedibile" e potrebbe causare di tutto al tuo programma. Considerando che lo passi ai nuovi thread ci starei molto attento.

    In più, le funzioni si chiamano funz_invio e funz_ricevo ma tu passi l'indirizzo di invio e ricevo (?) ...
    Intendi come argomento della funzione?
    questo perchè il thread come argomento della funzione chiede una (void*) e a me serve comunicare alla funzione la socket del server. o no?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ci siamo capiti ...

    Tu passi l'indirizzo di invio

    &invio

    ma la funzione si chiama

    funz_invio
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non ci siamo capiti ...

    Tu passi l'indirizzo di invio

    &invio

    ma la funzione si chiama

    funz_invio
    funz_invio è la funzione eseguita dal thread creato, invio è il tid del thread..

    la struttura della creazione del thread è:
    int pthread_create(thread_t *tidp, phread_attr_t *attr, void* (*funzione), void* arg);
    Mi pare sia corretta...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Corretto ... ma questa linea

    clientfd=accept(serverfd,);

    sembra incompleta

    Guarda questo esempio

    https://gist.github.com/silv3rm00n/5821760
    Ultima modifica di oregon; 13-03-2014 a 13:17
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Si, perchè ho scritto a spanne, ma è corretto l'accept completo.
    clientfd = accept(serverfd, (struct sockaddr *)&client_addr, (socklen_t*)&c)si ho visto l'esampio su https://gist.github.com/silv3rm00n/5821760

    ed infatti è corretto. Coincide perfettamente; la sua funzione connection handler coincide con la mia funzione funz_ricevo.

    Infatti si connettono tutti i client che voglio e tutti riescono ad inviare al server e il server riceve tutto.
    Il problema è che il server scrive solo ad un client e non a tutti, è qui il focus del problema.

Tag per questa discussione

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 © 2025 vBulletin Solutions, Inc. All rights reserved.