PDA

View Full Version : [C] dividere comandi da argomenti


andros94
05-07-2012, 20:22
Ho deciso di creare un server e un client in C per imparare l uso dei socket e fin li ci sono arrivato...ora vorrei migliorare il progetto permettendo al client di inviare dei comandi con eventuali argomenti al server, il server una volta elaborato il comando mandi la risposta al client ma come posso fare in modo che il server divida il comado dal/dagli argomento/i e li metta in apposite variabili ?
Poi posso usare una struttura IF o SWITCH per vedere cosa far fare al server.
Grazie in anticipo per l'aiuto

pabloski
05-07-2012, 21:53
Devi semplicemente sfruttare argv. Se ad esempio c'hai il tuo client, lo avvierai con:

nomeclient nomecomando param1 param2 ....

argv[1] è il comando e tutti gli altri da argv[2] in poi sono le opzioni del comando

Se il client, a sua volta, accetta parametri multipli, allora devi mettere un parametro ( tipo -c ) e considerare tutto quello che viene dopo -c e prima di un altro parametro ( che dev'essere del tipo -qualcosa ) come il comando e i suoi parametri.

Ad esempio

nomeclient -e pippo -c comando param1 param2 -d xxxyyy

in questo caso -e e -d sono due parametri da passare a nomeclient e -c con tutto ciò che lo sedue ( escludendo -d xxxyyy ) indica il comando e i relativi parametri.

Ovviamente non è che -e sta in argv[1], -c in argv[2] e -d in argv[3].

Ogni elemento separato da uno spazio va in una posizione successiva di argv. Devi tenerne conto!!

andros94
05-07-2012, 22:02
Devi semplicemente sfruttare argv. Se ad esempio c'hai il tuo client, lo avvierai con:

nomeclient nomecomando param1 param2 ....

argv[1] è il comando e tutti gli altri da argv[2] in poi sono le opzioni del comando

Se il client, a sua volta, accetta parametri multipli, allora devi mettere un parametro ( tipo -c ) e considerare tutto quello che viene dopo -c e prima di un altro parametro ( che dev'essere del tipo -qualcosa ) come il comando e i suoi parametri.

Ad esempio

nomeclient -e pippo -c comando param1 param2 -d xxxyyy

in questo caso -e e -d sono due parametri da passare a nomeclient e -c con tutto ciò che lo sedue ( escludendo -d xxxyyy ) indica il comando e i relativi parametri.

Ovviamente non è che -e sta in argv[1], -c in argv[2] e -d in argv[3].

Ogni elemento separato da uno spazio va in una posizione successiva di argv. Devi tenerne conto!!

E se invece vorrei scrivere comandi e parametri a video,ovvero attraverso console ??

pabloski
05-07-2012, 22:14
E se invece vorrei scrivere comandi e parametri a video,ovvero attraverso console ??

Se intendi sulla riga di comando, era proprio a quello che mi riferivo.

andros94
05-07-2012, 22:29
Ma l'argv non viene riempimento solo all'avvio?
io vorrei inviare più comandi in una sessione

pabloski
05-07-2012, 22:46
Ma l'argv non viene riempimento solo all'avvio?
io vorrei inviare più comandi in una sessione

In questo caso devi leggere i comandi da console tramite gets e poi inviarli.

andros94
06-07-2012, 07:17
Ma come faccio poi dal server, dato il buffer, a dividere il comando dagli argomenti, togliendo gli spazi ??

pabloski
06-07-2012, 10:25
Ma come faccio poi dal server, dato il buffer, a dividere il comando dagli argomenti, togliendo gli spazi ??

Leggi la stringa e la processi. La scorri, ogni volta che trovi uno spazio prelevi tutta la parte a sinistra dello spazio e la ficca in un'array.

Procedi così fino alla fine della stringa. Questa è la versione lunga e manuale. Nella realtà si usa la funzione strtok del C http://www.cplusplus.com/reference/clibrary/cstring/strtok/

andros94
07-07-2012, 10:05
#include <stdio.h>
#include <string.h>

int main()
{
char s[] = "ls -a -l";
char* p;
printf("Stringa : \n %s\nToken:\n",s);
p = strtok(s, " -");
while (p != NULL)
{
printf("%s\n", p);
p = strtok(NULL, " -");
}
}

Grazie
ora vorrei mettere i token in un array o qualcosa del genere per tenerli ordinati per poi processari con un ciclo for

pabloski
07-07-2012, 10:37
Basta fare così

#include <stdio.h>
#include <string.h>

int main()
{
char s[] = "ls -a -l";
char* p[256];
int i=0,j;
p[i++] = strtok(s, " -");
while (p[i] != NULL)
{
p[i++] = strtok(NULL, " -");
}

for (j=0;j<i;j++) printf("%s\n",p[j]);
}

andros94
07-07-2012, 11:38
Basta fare così

#include <stdio.h>
#include <string.h>

int main()
{
char s[] = "ls -a -l";
char* p[256];
int i=0,j;
p[i++] = strtok(s, " -");
while (p[i] != NULL)
{
p[i++] = strtok(NULL, " -");
}

for (j=0;j<i;j++) printf("%s\n",p[j]);
}

grazie per l' aiuto ma non stampa l' ultimo argomento

pabloski
07-07-2012, 11:48
grazie per l' aiuto ma non stampa l' ultimo argomento

Strano, a me stampa ls a l.

Prova così


#include <stdio.h>
#include <string.h>

int main()
{
char s[] = "ls -a -l";
char* p[256];
int i=0,j;
p[i++] = strtok(s, " -");
while (p[i-1] != NULL)
{
p[i++] = strtok(NULL, " -");
}
i--;
for (j=0;j<i;j++) if (p[j]) printf("%s\n",p[j]);
}

andros94
07-07-2012, 12:15
grazie funziona. Ma a che servono i contatori i e j?

pabloski
07-07-2012, 12:19
grazie funziona. Ma a che servono i contatori i e j?

j serve a scorrere tutto l'array nel ciclo for e i serve ad aggiungere man mano i token nell'array e, alla fine del while, tiene conto di quanti elementi ci sono nell'array