c-解析HTTP标头的子集以识别主机web地址



HTTP协议都包含在TCP数据包的数据部分中。

作为一项任务,我需要只使用字符串解析函数来解析HTTP头字段(出于这个问题的目的,我们只考虑主机网址),我不能使用任何现有的库来做到这一点。我试图找到HTTP标头的逐位分段,但失败了。我真的不知道现在该怎么办。有什么建议吗?

提前感谢

我已经提取了以太网、IP和TCP报头信息,并解析了十六进制形式的数据,即

数据

    48 54 54 50 2F 31 2E 31 20 33 30 34 20 4E 6F 74         HTTP/1.1 304 Not
    20 4D 6F 64 69 66 69 65 64 0D 0A 58 2D 43 6F 6E          Modified..X-Con
    74 65 6E 74 2D 54 79 70 65 2D 4F 70 74 69 6F 6E         tent-Type-Option
    73 3A 20 6E 6F 73 6E 69 66 66 0D 0A 44 61 74 65         s: nosniff..Date
    3A 20 54 68 75 2C 20 30 31 20 44 65 63 20 32 30         : Thu, 01 Dec 20
    31 31 20 31 33 3A 31 36 3A 34 30 20 47 4D 54 0D         11 13:16:40 GMT.
    0A 53 65 72 76 65 72 3A 20 73 66 66 65 0D 0A 58         .Server: sffe..X
    2D 58 53 53 2D 50 72 6F 74 65 63 74 69 6F 6E 3A         -XSS-Protection:
    20 31 3B 20 6D 6F 64 65 3D 62 6C 6F 63 6B 0D 0A          1; mode=block..
    0D 0A                     
                          ..

MeNa展示了分离HTTP头字段的技巧。但要做到这一点,我需要将数据负载转换为字符串。我尝试了以下方式:

unsigned char * data;
data = (unsigned char *)(packet + ETHERNET_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE);
int length = header_length - (ETHERNET_HEADER_SIZE + IP_HEADER_SIZE + TCP_HEADER_SIZE);
char string[length];
for (i = 0; i < length; i++) {  
    string[i] = (char)data[i];
}
printf("%s ", string);

这会打印出一个字符串,但大部分是小方块,而不是字符:(

我认为HTTP头没有按位分段。在HTTP中,每个标头都以"\r\n"结尾。因此,您只需要查找下一个"\r\n"并将其选中。

类似于:

char httpRe[] ="GET / HTTP/1.1rnHost: http://stackoverflow.com/rnReferer: https://www.google.com/rnrn";
char * parser = strtok (httpRe,"rn");
while (parser != NULL){
   printf ("%sn",parser);
   parser = strtok (NULL, "rn");
}

这就是你要找的?

最新更新