PDA

Visualizza la versione completa : [C] Server multithread, problema accettazione connessioni


Smoke666
10-10-2012, 15:32
Ciao a tutti ragazzi, sto programmando un server che riceve su una socket singole richieste da molteplici client. Ogni connessione deve essere gestita da un thread. Ad un certo punto del codice, il server fa una listen() ed entra in un ciclo che non fa altro che accettare le connessioni, invocare un thread per soddisfare tale richiesta e incrementare una variabile che tiene traccia di quanti thread sono stati creati. Le risposte vengono scritte direttamente sulla socket dai vari thread. A questo punto mi sono bloccato: le specifiche dicono che il server termina quando riceve un segnale di SIGINT o SIGTERM, alla ricezione bisogna attendere che tutti i thread terminino, scrivere su un file di log e chiudere la socket. Il mio dubbio risiede qui: come posso uscire dal ciclo infinito alla ricezione di tale segnale? Dal punto di vista del codice sono a questo punto:



......
listen(socket, SOMAXCONN);
while(1){
if( acp = accept(socket, NULL, NULL) != -1 ){
//worker è la funzione che dovrà eseguire il thread.
pthread_create(&t_id, NULL, worker, (void *) acp);
pthread_detach(t_id);
//mutua esclusione per l'accesso alla variabile condivisa w che tiene traccia dei thread creati
pthread_mutex_lock(&w_mux);
w++;
}
else continue;
}


Devo sicuramente cambiare la condizione del while, ma con cosa? Vi ringrazio in anticipo!

c0der
10-10-2012, 15:38
come posso uscire dal ciclo infinito alla ricezione di tale segnale?

Per uscire da un ciclo:


int running;

running = 1;
while (running) {
...
}


Per catturare SIGINT o SIGTERM usi la funzione signal, una volta catturato il segnale poni running = 0 e fai il resto del tuo lavoro.

[EDIT] riguardo al numero massimo di connessioni, magari lo sai già, lo puoi definire semplicemente attraverso il secondo argomento di listen.

Smoke666
10-10-2012, 15:40
Per catturare SIGINT o SIGTERM usi la funzione signal

Ero così preso dalla cosa che non ho nemmeno pensato alla signal! Ti ringrazio davvero molto! :D

Smoke666
10-10-2012, 15:48
Grazie per l' Edit, nel mio caso SOMAXCONN è il numero massimo di connessioni, la variabile w mi serve per sapere quanti thread non sono ancora terminati nel momento in cui il server riceve il segnale! ;)

Edit: Il codice ora si presenta così:


while(run){
signal(SIGINT, fun_sig);
signal(SIGTERM, fun_sig);
if( acp = accept(socket, NULL, NULL)!= -1 ){
pthread_create(&t_id, NULL, worker, (void *) acp);
pthread_detach(t_id);
pthread_mutex_lock(&w_mux);
w++;
}
else continue;
}


fun_sig invece:



void fun_sig(){
run = 0;
}


Run è ovviamente una variabile globale! Può andar bene così?

c0der
10-10-2012, 20:56
Va bene, a parte che le due chiamate a signal le dovresti mettere prima del while,
richiamarle a ogni ciclo (nuova connessione) non serve.

Loading