-1

我是 C 的新手,我正在尝试检查一些字符串。

以下是我的代码,评论指出我不明白为什么会发生的问题:

if (strstr(recBuff, "GET / HTTP/1.0\r\n\r\n") != NULL)
    //Send HTTP/1.0 200
    //This gets recognised fine
else if (strstr(recBuff, "GET / HTTP/1.0\r\r") != NULL)
    //Send HTTP/1.0 200
    //This gets recognised fine
else if (strstr(recBuff, "GET / HTTP/1.0\r\n") != NULL)
    //Do something else
    //This never gets picked up, and instead goes to the final else...
else
    //HTTP/1.0 404
    //Etc

我想我的问题是为什么 strstr 会接手\r\n\r\n并对其采取行动,但它\r\n本身就一直经历到最后的其他?有一个 else\r\n\r\n可以工作,但是一个 else 对 single\r\n不起作用\r\n

TL; DR"GET / HTTP/1.0\r\n\r\n"被拿起,但"GET / HTTP/1.0\r\n"没有。

4

1 回答 1

1

您还没有将代码简化为 SSCCE(简短、独立、正确的示例),因此我们无法判断您做错了什么。但是,您认为有两个回车的数据很可能实际上不包含两个相邻的回车。但是,只有某种十六进制转储或类似的东西才能肯定地表明这一点。

这是一个 SSCCE,它表明如果给定正确的数据,您的代码可以工作:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *examples[] =
    {
        "YYYYGET / HTTP/1.0\r\nExample 1 Single CRLF",
        "YYYYGET / HTTP/1.0\r\n\r\nExample 2 Double CRLF",
        "YYYYGET / HTTP/1.0\r\r\nExample 3 Double CR",
        "YYYYGET / HTTP/1.0\n\nExample 4 Double NL",
    };

    for (int i = 0; i < 4; i++)
    {
        char *recBuff = examples[i];
        printf("Data:\n%s\n", recBuff);
        if (strstr(recBuff, "GET / HTTP/1.0\r\n\r\n") != NULL)
            printf("Option 1 - double CRLF\n");
        else if (strstr(recBuff, "GET / HTTP/1.0\r\r") != NULL)
            printf("Option 2 - double CR\n");
        else if (strstr(recBuff, "GET / HTTP/1.0\r\n") != NULL)
            printf("Option 3 - single CRLF\n");
        else
            printf("Option 4 - no match\n");
    }

    return 0;
}

样本输出

$ ./counter-example
Data:
YYYYGET / HTTP/1.0
Example 1 Single CRLF
Option 3 - single CRLF
Data:
YYYYGET / HTTP/1.0

Example 2 Double CRLF
Option 1 - double CRLF
Data:
YYYYGET / HTTP/1.0
Example 3 Double CR
Option 2 - double CR
Data:
YYYYGET / HTTP/1.0

Example 4 Double NL
Option 4 - no match
$

因此,如果您没有看到与您的代码类似的东西,那么您就没有获得您认为您获得的数据。

YYYY部分不是复制所必需的;信息也不是Example n。尾随部分确保相当难以区分的字符串是可识别的;这YYYY可以说是绒毛,因为 HTTP 协议不会以此类垃圾开头。

于 2013-09-17T05:24:45.370 回答