[c] server multithreaded

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
pegasus_1987
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 314
Iscrizione: mercoledì 25 ottobre 2006, 4:40

[c] server multithreaded

Messaggio da pegasus_1987 »

salve,
qualcuno ha un esempio di server multithreaded AF_UNIX??...
Ultima modifica di pegasus_1987 il giovedì 14 maggio 2009, 11:38, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] server multithreaded

Messaggio da Zoff »

pegasus_1987 ha scritto: salve,
qualcuno ha un esempio di server multithreaded AF_UNIX??...
Ah ah...
Visto il nome (...1987) e il periodo scommetto che frequenti ingegneria e in particolare un corso di reti di calcolatori :P

In tal caso ecco un TCP Server Concorrente (forkato) direttamente dalle slide di quando ho seguito il corso:

Codice: Seleziona tutto

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define SERV_TCP_PORT 6000

int main(int argc, char *argv[]) {

int sockfd, newsockfd, clilen, childpid, tmp;
    struct sockaddr_in   cli_addr, serv_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sockfd < 0) {
        err_dump("server: can't open socket");
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family      = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port        = htons(SERV_TCP_PORT);
    tmp = bind(sockfd, (struct sockaddr*) &serv_addr,
    sizeof(serv_addr));
    if (tmp < 0) {
        err_dump("server: can't bind local socket");
    }

    listen(sockfd, 5);
    for (;;) {
        clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen);
        if (newsockfd < 0) {
            err_dump ("server: accept error");
        }
        str_echo(newsockfd);
        close(newsockfd);
    }
}  
err_dump se non erro era una funziona definita dal mio prof per evitare di scrivere in stderr...
Ultima modifica di Zoff il giovedì 14 maggio 2009, 12:22, modificato 1 volta in totale.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
pegasus_1987
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 314
Iscrizione: mercoledì 25 ottobre 2006, 4:40

Re: [c] server multithreaded

Messaggio da pegasus_1987 »

A me serviva AF_UNIX per farlo girare in locale..
avevo un'altra domanda..

devo implementare un thread che controlla se un file è stato modificato..non so cm passare i parametri alla pthread_create..e sinceramente non so neanke se posso passare parametri dentro..potete aiutarmi?

Codice: Seleziona tutto

--altro codice--
struct file_t* args;
	args=(struct file_t*)malloc(sizeof(struct file_t));
	args->path=(char*)malloc(sizeof(char)*UNIX_PATH_MAX);
	strcpy(args->path,PATHSERV);
	args->lastModified=lastModified;
	args->r=r;

	pthread_create(&tid,NULL,&writer,&args);
--altro codice --

--codice thread--

int writer(file_t* args){

FILE* filePermessi;
struct stat infoFile;
nodo_t* p;

if (stat(args->path,&infoFile)== -1){printf("Errore writer \n"); return -1;}

if (args->lastModified!=(infoFile.st_mtime)){
	p=&args->r;
	freeTree(p);
	filePermessi=fopen(args->path,"r");
	if (filePermessi==NULL) {perror("Errore apertura file"); return -1;}

	if(loadPerm(filePermessi,args->r)<0){printf("Errore loadperm"); return -1;}
	args->lastModified=infoFile.st_mtime;
	}
return 0;
}
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [c] server multithreaded

Messaggio da Zoff »

pegasus_1987 ha scritto: A me serviva AF_UNIX per farlo girare in locale..
avevo un'altra domanda..

devo implementare un thread che controlla se un file è stato modificato..non so cm passare i parametri alla pthread_create..e sinceramente non so neanke se posso passare parametri dentro..potete aiutarmi?

Codice: Seleziona tutto

--altro codice--
struct file_t* args;
	args=(struct file_t*)malloc(sizeof(struct file_t));
	args->path=(char*)malloc(sizeof(char)*UNIX_PATH_MAX);
	strcpy(args->path,PATHSERV);
	args->lastModified=lastModified;
	args->r=r;

	pthread_create(&tid,NULL,&writer,&args);
--altro codice --

--codice thread--

int writer(file_t* args){

FILE* filePermessi;
struct stat infoFile;
nodo_t* p;

if (stat(args->path,&infoFile)== -1){printf("Errore writer \n"); return -1;}

if (args->lastModified!=(infoFile.st_mtime)){
	p=&args->r;
	freeTree(p);
	filePermessi=fopen(args->path,"r");
	if (filePermessi==NULL) {perror("Errore apertura file"); return -1;}

	if(loadPerm(filePermessi,args->r)<0){printf("Errore loadperm"); return -1;}
	args->lastModified=infoFile.st_mtime;
	}
return 0;
}
In caso di multithreading il passaggio di messaggi può essere fatto tramite ad esempio un pipeline...
Ma questo è un altro problema... Meglio se apri un altra discussione...

Per il server mi sono accorto dell'errore solo dopo aver inviato, sorry :(
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
theshade14
Prode Principiante
Messaggi: 47
Iscrizione: giovedì 27 settembre 2007, 11:14

Re: [c] server multithreaded

Messaggio da theshade14 »

per i miei ricordi riguardo la creazione dei thread in C si posso passare gli argomenti al nuovo thread mediante puntatori, però è una pratica sconsigliata in quanto ti espone ad un exploit.

Codice: Seleziona tutto

pthread_t th;
int x;
pthread_create(&th,NULL,(void*)nomefunzione,&x);
Avatar utente
kiroken_
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2008
Iscrizione: mercoledì 2 maggio 2007, 17:38

Re: [c] server multithreaded

Messaggio da kiroken_ »

@theshade14
che tipo di exploit? non ne ho mai sentito parlare
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
theshade14
Prode Principiante
Messaggi: 47
Iscrizione: giovedì 27 settembre 2007, 11:14

Re: [c] server multithreaded

Messaggio da theshade14 »

allora non essendo un esperto programmatore non so dirti... però ricordo benissimo che durante un compito di sistemi operativi un assistente mi disse che passare per riferimento una variabile al nuovo thread era rischioso perchè poteva essere passata una locazione di memoria qualsiasi... a questa affermazione io chiesi "mediante un exploit??" e lui mi rispose si... mi disp ma non so dirti di più. Ritenevo doveroso riferirlo insieme al codice.
Ikitt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1816
Iscrizione: mercoledì 24 ottobre 2007, 12:05

Re: [c] server multithreaded

Messaggio da Ikitt »

theshade14 ha scritto: allora non essendo un esperto programmatore non so dirti... però ricordo benissimo che durante un compito di sistemi operativi un assistente mi disse che passare per riferimento una variabile al nuovo thread era rischioso perchè poteva essere passata una locazione di memoria qualsiasi... a questa affermazione io chiesi "mediante un exploit??" e lui mi rispose si... mi disp ma non so dirti di più. Ritenevo doveroso riferirlo insieme al codice.
Non e` pericoloso passare per indirizzo una variabile ad un thread -per lo meno, non lo e` piu` che usare in genere i puntatori-. Dipende dal codice.
Penso che l'assistente intendesse che si rischiano riferimenti pendenti e quindi eventuali segmentation fault.
In tal caso, direi che e` fuori luogo parlare di exploit.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti