質問

私のパケットキャプチャが行えるコードの書き込むというhttpのペイロードにファイルです。今では、抽出したい場合、URL情報からこれらの堆積場.各パケットのペイロードを開始。

GET/intl/en_com/images/logo_plain.png HTTP/1.1のように..主催:www.google.co.in..User-Agent:Mozilla/5.0

いの抽出:

  1. 文字列の間の取得"GET"や"HTTP/1.1"
  2. 文字列の間"主催:"および"ユーザーエージェント"

どのように。はありまinbuilt文字列)または正規表現?

役に立ちましたか?

解決

Cさんを内蔵して正規表現が図書館利用 http://www.arglist.com/regex/, http://www.pcre.org/ の見えいたします。

課題このプで簡単に取得することかを使わずにregexesものです。のラインはすべて未満の一部の最大長さ MAXLEN, での過程の具体的な方法として、タイトル:

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);

このソリューションを必要としませんバッファリングのファイルをメモリとしてKennyTMの回答はもとでの道がわかっている場合は、それをファイル)。知を使用していま fgets() の代わりに、安全でない gets(), がしやすいバッファオーバーフロー長。

他のヒント

\r を使用 strchrstrstr).以降の文字列 GETHTTP/1.1Host: は固定長さの指標と位置パス間を抽出することができます。


を利用する場合は正規表現には、POSIX準拠のシステムはありま regcomp(3), でもなかなか難しい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top