|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
[C] dividere comandi da argomenti
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
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!! |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Ma l'argv non viene riempimento solo all'avvio?
io vorrei inviare più comandi in una sessione |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Ma come faccio poi dal server, dato il buffer, a dividere il comando dagli argomenti, togliendo gli spazi ??
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
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/c...string/strtok/ |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
Codice:
#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, " -");
}
}
ora vorrei mettere i token in un array o qualcosa del genere per tenerli ordinati per poi processari con un ciclo for |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Basta fare così
Codice:
#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]);
}
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
grazie per l' aiuto ma non stampa l' ultimo argomento
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Strano, a me stampa ls a l.
Prova così Codice:
#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]);
}
Ultima modifica di pabloski : 07-07-2012 alle 12:53. |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
grazie funziona. Ma a che servono i contatori i e j?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:03.




















