0

http ペイロードをファイルに書き込むパケット キャプチャ コードがあります。これらのダンプから URL 情報を抽出したいと思います。パケットごとに、ペイロードは次のように始まります。

GET /intl/en_com/images/logo_plain.png HTTP/1.1..ホスト: www.google.co.in..ユーザーエージェント: Mozilla/5.0

抽出したい:

  1. 「GET」と「HTTP/1.1」の間の文字列
  2. 「Host:」と「User-Agent」の間の文字列

Cでこれを行う方法は?組み込みの文字列関数はありますか? または正規表現?

4

2 に答える 2

2

C には組み込みの正規表現はありませんが、ライブラリを利用できます

この単純なタスクでは、正規表現を使用しなくても簡単に回避できます。行がすべて最大長より短い場合はMAXLEN、一度に 1 行ずつ処理します。

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()ある unsafe の代わりに使用していることに注意してください。gets()

于 2010-01-17T09:56:22.530 に答える
1

(または) を\r使用している場所を探します。文字列ととは固定長であるため、その間のパスのインデックスと場所を簡単に抽出できます。strchrstrstrGETHTTP/1.1Host:


正規表現を使用したい場合、POSIX 準拠のシステムには がありますがregcomp(3)、これも非常に使いにくいものです。

于 2010-01-17T09:39:44.003 に答える