Silver Shadow Inviato 8 Giugno 2009 Segnala Condividi Inviato 8 Giugno 2009 Ciao a tutti, sto facendo un po' di esercizi per prender pratica con le socket. In particolar modo starei provando a realizzare una connessione fra un server e molti client, cercando di gestire un server multithreaded. L'idea di base, riguardo il server, consiste nell'avere 2 thread: - il main che si occupa di mettersi in ascolto di nuove richieste, creando un nuovo thread worker per ogni nuova connessione richiesta; - un thread worker che si occupa di gestire la connessione relativa ad uno specifico client. Alcune informazioni: per ora sto facendo pratica con i soli domini AF_UNIX, e connessioni SOCK_STREAM. Riporto qui sotto i codici sia di client che di server CLIENT #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKNAME "./mysocket" #define UNIX_PATH_MAX 108 #define N 100 int main(void) { int c_fd; struct sockaddr_un sa; strncpy(sa.sun_path, SOCKNAME, UNIX_PATH_MAX); sa.sun_family = AF_UNIX; c_fd = socket(AF_UNIX, SOCK_STREAM, 0); while (connect(c_fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) if (errno == ENOENT) sleep(1); else { perror("connect"); exit(EXIT_FAILURE); } write(c_fd, "Hallo!", 7); printf("Client %d ha inviato il messaggio\n", getpid()); close(c_fd); return 0; } SERVER #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <pthread.h> #define SOCKNAME "./mysocket" #define UNIX_PATH_MAX 108 #define N 100 void *worker(void *arg) { printf("parte worker\n"); char buf[N]; while (read((int *) arg, buf, N) != 0) { printf("Server %d got: %s\n", getpid(), buf); } close((int *) arg); return 0; } int main(void) { unlink(SOCKNAME); int s_fd, c_fd; struct sockaddr_un sa; strncpy(sa.sun_path, SOCKNAME, UNIX_PATH_MAX); sa.sun_family = AF_UNIX; s_fd = socket(AF_UNIX, SOCK_STREAM, 0); bind(s_fd, (struct sockaddr *) &sa, sizeof(sa)); listen(s_fd, SOMAXCONN); pthread_t tid; while (1) { c_fd = accept(s_fd, NULL, 0); pthread_create(&tid, NULL, worker, (void *) c_fd); pthread_detach(tid); } return 0; } Mandando il tutto in esecuzione funziona bene, però vorrei avere qualche parere riguardo l'implementazione, in particolar modo del server. Secondo voi è una buona gestione (sia per i thread che le socket)? Suggerimenti/consigli/critiche? Just when things went right, it doesn't mean they were always wrong ~ » Use Your Illusion « Link al commento Condividi su altri siti Altre opzioni di condivisione...
Messaggi raccomandati
Archiviato
Questa discussione è archiviata e chiusa a future risposte.