Commandline-Argument parsen

lano

Aktives Mitglied
Moin.

Ich weiß gar nicht wie ichs beschreiben soll....

Ich hab nen Programm das Netzwerkpakete parst.
nun will ich einige pakete ggf speichern.
Dazu hab ich mir gedacht, wenn ich dem Programm nen --dump 08 mit gebe dann soll es mir alle 08er Pakete speichern.
Aber
Was zum geier mach ich wenn ich --dump 08,21 übergeben will um alle 08er und 21er pakete zu speichern?
Können ja auch beliebig mehr sein.

Ideen ?
 
Sagen wir list ist ein char * der auf deinen kommagetrennten String zeigt ...
C:
char *substr = strtok(list, ",");
do {
  printf("mach hier was mit %s\n", substr);
} while ((substr = strtok(NULL, ",")));
Statt printf kannst du da bspw. eine eigene Funktion aufrufen und mit substr füttern.
 
Statt printf kannst du da bspw. eine eigene Funktion aufrufen und mit substr füttern.

hmm..
ich hab im Programm das so:
C:
if ((packet[offset] == OFFSET_BEACON)) { // beacon frame
  dbprintf(LOGLEVEL_INFO, "Beacon frame (0x0008):\n");
  //pcap_dump((u_char*)pdumper, header, packet);
  parse_packet_Beacon(db, packet, offset);
  count_Beacon++;
} else if ((packet[offset] == OFFSET_ASSOCIATIONREQUEST)) {
  dbprintf(LOGLEVEL_INFO, "Association Request (0x0000):\n");
  //pcap_dump((u_char*)pdumper, header, packet);
  parse_packet_AssociationRequest(db, packet, offset);
  count_AssociationRequest++;
}

ich könnte ja die einzelnen elemente vom komma string in ein array packen und dann immer schaun ob OFFSET_BEACON zb im array ist. würde das sinn machen ?
 
Hmpf. Ich hab von dem ganze Kram überhaupt keinen Schimmer. Also, OFFSET_BEACON und OFFSET_ASSOCIATIONREQUEST sind numerische Werte, nehme ich an. Und deine kommagetrennten Werte, zur Zahl konvertiert, würde dann den Werten dieser Macros entsprechen, richtig?

Wie viele solcher Werte gibt es denn? Müsste ein Array dynamisch allokiert werden oder gibt's irgendeine Obergrenze die nicht gleich in die Tausende geht?
 
So aus dem Handgelenk raus, vielleicht:

C:
// Vergleichsfunktion für qsort und bsearch.
int compare(const void *a, const void *b) {
  if (*(long *)a < *(long *)b)
    return -1;

  if (*(long *)a > *(long *)b)
    return 1;

  return 0;
}
C:
long arr[128] = {0};
unsigned arrLength = 0U;
for (char *substr = strtok(list, ","); substr != NULL && arrLength < 128; substr = strtok(NULL, ","))
  arr[arrLength++] = strtol(substr, NULL, 10);

// damit bsearch schneller am Ziel ist ...
qsort(arr, arrLength, sizeof(long), compare);

// ...

if (bsearch((long[]){OFFSET_BEACON}, arr, arrLength, sizeof(long), compare) != NULL)
  puts("found");
else
  puts("not found");
 
Zuletzt bearbeitet:
Zurück
Oben Unten