Vai al contenuto

[C] Socket: 1 server (multithreaded) - molti client


Messaggi raccomandati

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

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...