PDA

Visualizza la versione completa : [c] client server ed exec


ubuntuunixc
24-06-2008, 13:05
ciao raga avrei un problema

ho fatto un prgramma client server ( il client invia messaggi al server che li visualizzaa video)

ora vorrei far si che quando inserisco una determinata stringa mi fa una exec inviando i dati a schermo

per esempio scrivo ls ed il server mi visualizza il contenuto della cartella
il problema e che l'exec mi blocca il server come fare?
posto una parte del codice

bind(server_fd, (struct sockaddr *) &server, sizeof(server)); //creazione collegamento
listen(server_fd,5);//resta in ascolto con una coda massima di 5
client_fd=accept(server_fd,(struct sockaddr *)&client,&client_size);

while(strncmp(stringa,"exit",4)!=0) //Confronto tra stringhe sui primi n caratteri
{
n=read(client_fd,stringa,50);

if(strncmp(stringa,"ls",2)==0)
execlp("ls", "ls", (char) 0);
else

write(1,stringa,n);
}


ciao e grazie

mondobimbi
24-06-2008, 15:39
perchè la exec prende il controllo e il tuo server si chiude.
Una soluzione è usare fork e chiamare la exec nel processo figlio. Probabilmente potresti anche usare un thread
ciao
sergio

ubuntuunixc
24-06-2008, 15:47
fatto ma contina a chiudersi


client_fd=accept(server_fd,(struct sockaddr *)&client,&client_size); //accetta connesione dal client
pid=fork();
if (pid==0)
{
while(strncmp(stringa,"exit",4)!=0) //Confronto tra stringhe sui primi n caratteri
{
n=read(client_fd,stringa,50);

if(strncmp(stringa,"ls",2)==0)
execlp("ls", "ls", (char) 0);
else
write(1,stringa,n);
}

}
else
{
wait(&status);

close(server_fd);
close(client_fd);
exit(0);

ho fatto un errore prima i dati devono essere poi inviati al client
come faccio se l'exec stampa a video? è possibile ridirezionare l'exec sul client?

mi spiego meglio

client -> invia messaggio ->server

il server
sesi scrive ls invia al client l'output del comando ls

altrimenti stampa a video la parola

tutto termina SOLO quando si scrive exit

mondobimbi
24-06-2008, 15:56
scusa ma è incomprensibile, indenta il codice e racchiudilo trai tag code o php (utilizza i pulsanti che trovi sopra questa text box.
ciao
sergio

ubuntuunixc
24-06-2008, 16:00
ecco fatto scusa ma non sono pratico dei forum :)

mondobimbi
24-06-2008, 16:12
allora devi usare popen e no exec, che ti apre un pipe (tu lo vuoi in lettura). Leggi dal pipe con le normali funzioni di lettura di file e lo chiudi con pclose.
Prova a fare
$man popen
per i dettagli
ciao
sergio

ubuntuunixc
24-06-2008, 16:28
fp=popen("ls ","r");

non mi è molto chiaro restituise un file puntato

devo aprirlo facendo openfile e read e write normale?

ubuntuunixc
24-06-2008, 16:36
funziona grazie
solo che uso la w

fp=popen("ls","w");
fputs(stringa,fp);
write(1,stringa,n);

ora devo passarlo al client

ti faccio sapere per il resto grazie ancora mi hai illuminato

mondobimbi
24-06-2008, 16:40
tu devi leggere dal pipe, mi sembra che dovresti fare


FILE * fp = popen ("ls -la", "r");

/* normali operazioni di lettura dal file pointer fp

pclose (fp); // si deve chiudere con pclose

ubuntuunixc
24-06-2008, 17:59
intendi dal lato client?

io dal client inserisco i valori il server li legge e li manda al client che li visulizza

ora non riesco a farli visualizzare sul client

server che mi visualizza a video



while(strncmp(stringa,"exit",4)!=0) //Confronto tra stringhe sui primi n caratteri, sicuro con i dati binari
{
n=read(client_fd,stringa,50);
if(strncmp(stringa,"ls",2)==0)
popen("ls","w");
else
write(1,stringa,n);
}



CODICE CLIENT CHE INSERISCE I DATI


connect(cli_fd,(struct sockaddr *) &client,sizeof(client));//connetti al server
while(strncmp(stringa,"exit",4)!=0) //Confronto tra stringhe sui primi n caratteri, sicuro con i dati binari
{

n=read(0,stringa,200);
write(cli_fd,stringa,n);


}
close(cli_fd);





dopo quest'ulima write metto una popen in r ????

Loading