如何让子串位于C中的两个子串之间?

时间:2010-01-17 09:35:51

标签: c url string substring packet-capture

我有一个数据包捕获代码,可将http有效负载写入文件。现在我想从这些转储中提取URL信息。 对于每个数据包,有效负载都是这样开始的。

  

获取/intl/en_com/images/logo_plain.png   HTTP / 1.1..Host:   www.google.co.in..User代理:   的Mozilla / 5.0

我想提取:

  1. “GET”和“HTTP / 1.1”之间的字符串
  2. “Host:”和“User-Agent”之间的字符串
  3. 如何在C中执行此操作?是否有任何内置的字符串函数?还是正则表达式?

2 个答案:

答案 0 :(得分:2)

C没有内置的正则表达式,虽然库可用:http://www.arglist.com/regex/http://www.pcre.org/是我经常看到的两个。

对于这个简单的任务,您可以轻松地在不使用正则表达式的情况下离开。如果行都小于某个最大长度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(),它在长行上容易出现溢出缓冲区。

答案 1 :(得分:1)

使用\r(或strchr)查找strstr的位置。由于字符串GETHTTP/1.1以及Host:具有固定长度,因此可以轻松提取其间的路径索引和位置。


如果要使用正则表达式,在POSIX兼容系统上有regcomp(3),但这也很难使用。