Pregunta

Tengo un código de captura de paquetes de carga útil que escribe en un archivo de http. Ahora quiero extraer la información de la URL de estos vertederos. Para cada paquete, la carga útil comienza como este.

  

GET /intl/en_com/images/logo_plain.png   HTTP / 1.1..Host:   www.google.co.in..User-Agent:   Mozilla / 5.0

Me gustaría extraer:

  1. la cadena entre "GET" y "HTTP / 1.1"
  2. la cadena entre "Anfitrión:" y "User-Agent"

¿Cómo hacer esto en C? ¿Hay algunas funciones de cadena incorporados? O expresiones regulares?

¿Fue útil?

Solución

C no se han incorporado en las expresiones regulares, aunque las bibliotecas están disponibles: http: // www. arglist.com/regex/ , http://www.pcre.org/ son la dos veo más a menudo.

Para una tarea de este sencillo, puede alejarse fácilmente sin necesidad de utilizar expresiones regulares sin embargo. Siempre que las líneas están a menos de algunos MAXLEN longitud máxima, sólo les procesar una línea a la vez:

char buf[MAXLEN];
char url[MAXLEN];
char host[MAXLEN];
int state = 0;      /* 0: Haven't seen GET yet; 1: haven't seen Host yet */
FILE *f = fopen("my_input_file", "rb");

if (!f) {
    report_error_somehow();
}

while (fgets(buf, sizeof buf, f)) {
    /* Strip trailing \r and \n */
    int len = strlen(buf);
    if (len >= 2 && buf[len - 1] == '\n' && buf[len - 2] == '\r') {
        buf[len - 2] = 0;
    } else {
        if (feof(f)) {
            /* Last line was not \r\n-terminated: probably OK to ignore */
        } else {
            /* Either the line was too long, or ends with \n but not \r\n. */
            report_error_somehow();
        }
    }

    if (state == 0 && !memcmp(buf, "GET ", 4)) {
        strcpy(url, buf + 4);    /* We know url[] is big enough */
        ++state;
    } else if (state == 1 && !memcmp(buf, "Host: ", 6)) {
        strcpy(host, buf + 6);   /* We know host[] is big enough */
        break;
    }
}

fclose(f);

Esta solución no requiere amortiguar el archivo completo en la memoria como la respuesta de KennyTM hace (aunque eso está muy bien por cierto si conoce los archivos son pequeños). Nótese que usamos fgets() en lugar de la gets() insegura, que es propenso a los tampones de desbordamiento en las líneas largas.

Otros consejos

Busque la ubicación de \r usando strchr (o strstr). Dado que las cadenas GET y HTTP/1.1 y Host: son de longitud fija, el índice y la ubicación de la trayectoria en el medio puede ser extraído fácilmente.


Si desea utilizar expresiones regulares, en los sistemas compatibles con POSIX, hay regcomp(3), pero eso es también muy difícil de usar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top